方法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
是什么?
答案 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用户指南中还有一个简短的属性描述。