Java Platform SE 5 API 规范的方法Instrumentation.redefineClasses(ClassDefinition[])
告诉:
重新定义可能会更改方法主体、常量池和 属性。重定义不得添加、移除或重命名字段或 方法、更改方法的签名或更改继承。
attributes
是什么意思?我认为它可以是访问修饰符(私有,公共,...),同步,最终和其他修饰符。但是,如果我不仅尝试重新定义方法主体,还尝试重新定义其访问修饰符或类的访问修饰符,或者尝试使方法同步,我得到了
java.lang.UnsupportedOperationException: class redefinition failed: attempted to change method modifiers
at sun.instrument.InstrumentationImpl.redefineClasses0(Native Method)
at sun.instrument.InstrumentationImpl.redefineClasses(Unknown Source)
那么在这种情况下attributes
是什么?
J2SE5 目前仅支持修改方法主体和字段值。如果您修改访问修饰符,则意味着您完全更改了类的接口。
对于属性,这是Java编程中一个非常模糊的概念,我不知道他们为什么要把这个词放到他们的文档中。当我们说属性时,在大多数情况下,我们指的是 Java 命名 API 中的属性。
重定义类提供了一种动态方法来更改现有系统的运行时行为。我认为被AOP广泛使用。
属性是添加到类文件中的类、方法和字段的附加信息片段。请参阅 Java VM 规范 http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.7。附录 A.3 (http://download.forge.objectweb.org/asm/asm4-guide.pdf) 中的 ASM 用户指南中也有对属性的简短描述。