开发者社区> 问答> 正文

javassist.CannotCompileException?报错

通过使用 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;
	}

展开
收起
爱吃鱼的程序员 2020-06-22 17:24:17 893 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    请我楼主是怎么解决的,我也遇到同样的问题没有办法解决, 只有用实现 接口的方式,新建一个类,然后接口.方法(),这样不用再查找一遍方法了

    2020-06-22 17:24:35
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载