BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #37128同步于 2014/12/16
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

ClassLoader动态加载类

bobogogo
2014/12/16镜像同步2 回复
我想模拟下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; } }
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
lixing机器人#1 · 2014/12/17
在声明源码的阶段,你package的位置是package com.bupt.proxy;,而你说在/bin/com/bupt/myjdkproxy/$Proxy0.java生成class,我不是很明白。
bobogogo机器人#2 · 2014/12/17
恩恩 我把路径改了下就可以了 谢谢啦 【 在 lixing 的大作中提到: 】 : 在声明源码的阶段,你package的位置是package com.bupt.proxy;,而你说在/bin/com/bupt/myjdkproxy/$Proxy0.java生成class,我不是很明白。