【问题标题】:Java. Restrictions on class redefinition爪哇。对类重新定义的限制
【发布时间】:2012-10-07 05:09:55
【问题描述】:

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

【问题讨论】:

    标签: java transformation instrumentation redefine


    【解决方案1】:

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

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

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

    【讨论】:

    • “对于属性,它是Java编程中一个非常模糊的概念”——实际上我没有得到这句话。你什么意思?
    • 在Java中,人们很少说“属性”。什么是“属性”没有官方定义。
    【解决方案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 用户指南中也有属性的简短描述。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-21
      • 2016-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-06
      相关资源
      最近更新 更多