返回信息流我想模拟下JDK动态代理,报Exception in thread "main" java.lang.NoClassDefFoundError: com/bupt/myjdkproxy/$Proxy0 (wrong name: com/bupt/proxy/$Proxy0)
$Proxy0这个类和class文件都在bin/com/bupt/myjdkproxy下面
在调用:Class c = cl.loadClass("com.bupt.myjdkproxy.$Proxy0");时报的错
求大神指导。
具体代码如下:
public class Proxy {
public static Object newProxyInstance(Class infce) throws Exception{
String rt = "\r\n"; // 换行
// 获取方法
String methodStr = "";
for (Method m : infce.getMethods()) {
methodStr += "@Override"+rt+
"public void "+m.getName()+"() {"+rt+
"System.out.println(\"日志开始。。。。\");"+rt+
"m."+m.getName()+"();"+rt+
"System.out.println(\"日至结束。。。。\" );"+rt+
"}";
}
//1. 声明一段源码
String str = "package com.bupt.proxy;"+rt+
"public class $Proxy0 implements "+ infce.getName()+" {"+rt+
"private "+ infce.getName()+" m;"+rt+
"public $Proxy0(){}"+rt+
"public $Proxy0("+ infce.getName()+" m){"+rt+
"this.m = m;"+rt+
"}"+rt+
methodStr+rt+
"}";
// 2. 编译源码 首先建立一个java文件,再编译文件
String filename = System.getProperty("user.dir") + "/bin/com/bupt/myjdkproxy/$Proxy0.java";
File file = new File(filename);
// 建立java文件
FileUtils.writeStringToFile(file, str);
// 编译java
// 2.2.1 得到系统的编译器
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
// 2.2.2 创建文件管理者
StandardJavaFileManager fileMgr = compiler.getStandardFileManager(null, null, null);
// 2.2.3 得到管理文件的数组
Iterable itera = fileMgr.getJavaFileObjects(filename);
// 编译任务
CompilationTask task = compiler.getTask(null, fileMgr, null, null, null, itera);
// 进行编译
task.call();
fileMgr.close();
// 3. 将编译好的文件load到内存当中
ClassLoader cl = ClassLoader.getSystemClassLoader();
Class c = cl.loadClass("com.bupt.myjdkproxy.$Proxy0");
System.out.println(c.getName());
return null;
}
}
这是一条镜像帖。来源:北邮人论坛 / java / #37128同步于 2014/12/16
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
ClassLoader动态加载类
bobogogo
2014/12/16镜像同步2 回复
订阅后,新回复会通过你的通知中心匿名送达。