通过使用 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; }
请我楼主是怎么解决的,我也遇到同样的问题没有办法解决, 只有用实现 接口的方式,新建一个类,然后接口.方法(),这样不用再查找一遍方法了
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。