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());
这行代码上,从问题描述上来看,是类重新定义失败:尝试更改架构(添加/删除字段导致的。