javassist.CannotCompileException

panmingguang 发布于 2013/08/21 09:15
阅读 4K+
收藏 0

通过使用 javassist 对某个类 添加一个方法, 采用 JDK自带的getDeclaredMethod 判断是否存在 新加的方法, 如果没有再使用 javassist 增加(以前的解决方法是直接新建一个类, 没有的时候JDK找不到这样就不会同时被加载), 遇到的问题:

因为 此类本身是存在的, JDK classloader 和 javassist classLoader 不可同时加载 报错如下

by java.lang.LinkageError: loader (instance of  sun/misc/Launcher$AppClassLoader): attempted  duplicate class definition for name

代码:

public static <T> T mapToBean(Map<String, ?> map, Class<T> _class){
		Class<?> clazz = null;
		String methodName = _class.getSimpleName()+"$javassisttoBean";
		try {
			clazz = Thread.currentThread().getContextClassLoader().loadClass("tom.cocook.ext.JavassistUtil");
			/***  加载后无法重新加载***/
			Method me = clazz.getDeclaredMethod(methodName, Map.class, Object.class);
			return (T) me.invoke(null, map, _class.newInstance());
		} catch (Exception e) {
			 try {
				 //创建方法 返回ctclass, toclass()的时候报错
				 clazz = createByMap(map, _class).toClass();
				Method me = clazz.getDeclaredMethod(methodName, Map.class, Object.class);
				return (T) me.invoke(null, map, _class.newInstance());
			} catch (Exception e1) {
				e1.printStackTrace();
			}

		}
		return null;
	}

加载中
0
王国庆1
请我楼主是怎么解决的,我也遇到同样的问题
0
panmingguang
panmingguang
没有办法解决,  只有 用实现  接口的方式, 新建一个类, 然后 接口.方法(), 这样不用再查找一遍方法了
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部