将项目的所有访问修饰符都更改为public时,字节码中项目的语义是否发生变化?

时间:2019-01-10 11:02:34

标签: java jvm bytecode semantics access-modifiers

假设我有一个带有.class文件的可运行jar(A.jar)。我还有另一个可运行的jar(B.jar),它与A.jar相同,只是将访问修饰符全部更改为public(对于字段和方法)。是否有可能更改某些语义?它(B.jar)的工作方式是否与上一个(A.jar)相同?有什么危险?

编辑示例: A.jar包含字节码(.class文件)。我用asm库解析它,并将其所有修饰符更改为public。生成的jar是B.jar文件。

1 个答案:

答案 0 :(得分:2)

一个可能的行为更改是私有方法不能覆盖超类中的方法。这意味着将子类方法更改为public可能会更改在运行时从虚拟调用中调用的方法。

来自JVM Spec v11 5.4.5

  

一个实例方法mC可以覆盖另一个实例方法mA   以下是正确的:

     

mC与mA具有相同的名称和描述符。

     

mC未标记为ACC_PRIVATE。

     

以下条件之一为真:

     

mA标记为ACC_PUBLIC。

     

mA标记为ACC_PROTECTED。

     

mA既不标记为ACC_PUBLIC也不标记为ACC_PROTECTED也不标记为ACC_PRIVATE,并且   (a)mA的声明出现在同一运行时程序包中   作为mC的声明,或(b)如果在A类和mC中声明了mA   在类C中声明,则存在在   B类,使得C是B的子类,而B是A和mC的子类   可以覆盖mB,mB可以覆盖mA。