3

方法的 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在这种情况下是什么?

4

2 回答 2

2

J2SE5 目前只支持修改方法体和字段值。如果您修改访问修饰符,则意味着您完全更改了类的接口。

对于属性,它是Java编程中一个非常模糊的概念,我不知道他们为什么将这个词放在他们的文档中。当我们说属性时,在大多数情况下,我们指的是 Java Naming API 中的属性。

重定义类提供了一种动态方式来改变现有系统的运行时行为。我认为被 AOP 广泛使用。

于 2012-10-17T02:28:17.837 回答
2

属性是添加到类文件中的类、方法和字段的附加信息。请参阅 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 用户指南中也有属性的简短描述。

于 2013-10-09T12:15:04.693 回答