Java的。对类重新定义的限制

时间:2012-10-17 01:42:13

标签: java transformation instrumentation redefine

方法Instrumentation.redefineClasses(ClassDefinition[])的Java Platform SE 5 API规范告诉:

  

重新定义可能会改变方法体,常量池和   属性。重新定义不得添加,删除或重命名字段或   方法,更改方法的签名或更改继承。

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是什么?

2 个答案:

答案 0 :(得分:2)

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

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

Redefinition类提供了一种动态方法来更改现有系统的运行时行为。我认为AOP广泛使用。

答案 1 :(得分:1)

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