1、attempted duplicate class definition for name
问题代码就出在:ctClass.toClass(); 这行代码上,从问题描述上来看,是重复加载了同一个类导致的。强烈建议参考 使用javassist运行时动态修改字节码对象。
javassist调用了 ClassLoader 的 defineClass 方法实现的类加载,调用java.lang.ClassLoader#defineClass(java.lang.String, byte[], int, int, java.security.ProtectionDomain)方法要确保一个类只会被同一个ClassLoader加载一次,否则就会报错:
javassist.CannotCompileException: by java.lang.ClassFormatError: loader (instance of sun/misc/Launcher$AppClassLoader): attempted duplicate class definition for name: "com/ymqx/动态增加属性和注解/Person"
at javassist.util.proxy.DefineClassHelper.toClass(DefineClassHelper.java:271)
at javassist.ClassPool.toClass(ClassPool.java:1240)
at javassist.ClassPool.toClass(ClassPool.java:1098)
at javassist.ClassPool.toClass(ClassPool.java:1056)
at javassist.CtClass.toClass(CtClass.java:1298)
2、class redefinition failed: attempted to change the schema (add/remove fields)
问题代码就出在:retransformClass(clazz, ctClass.toBytecode()); 这行代码上,从问题描述上来看,是类重新定义失败:尝试更改架构(添加/删除字段导致的。
本文探讨了在使用javassist库进行字节码操作时遇到的两个常见错误:1) 重复类定义错误,原因是类已被同一个类加载器加载;2) 类重新定义失败,通常由于尝试更改已有类的字段结构。解决这些问题的关键在于正确管理和控制类的加载以及避免对已定义类的不适当修改。
1105

被折叠的 条评论
为什么被折叠?



