访问没有字节码验证器的私有字段

时间:2014-08-29 08:28:58

标签: java security compiler-construction verification

该示例来自O' Reilly Java Security书籍。

有两个班级 Card.java

public class Card {
    public int num = 123234;
}

和 Test.java

public class Test {
    public static void main(String[] args) {
        Card card = new Card();
        System.out.println("Your card - " + card.num);
    }
}

我使用Java 1.2 编译这两个类。然后我将num字段的修饰符更改为private,并仅重新编译Card类。

启动Test(java Test)类会产生以下输出。

  

您的卡片 - 123234。

所以即使没有关闭字节码验证器也能工作(虽然作者说我们没有字节码验证器,但是它可以工作)。

现在我使用Java 1.6 做同样的事情。 即使我使用IllegalAccessError启动它,也会启动Test类生成-noverify

问题是:

1)它与字节码验证器有什么关系。如果没有,谁产生错误。

2)那么以前版本的Java中的错误是什么?

1 个答案:

答案 0 :(得分:3)

是的,这是一个旧的验证程序错误。看起来就是这个:

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4007892

从(公共)错误历史中确切地解释它的确切时间并不清楚,但我怀疑它很久以前就被修复了。


  

如果它是一个错误,它与字节码验证程序有什么关系

字节码验证器应该检查一个类是否尝试引用另一个类的私有字段。当JVM加载类时,应该进行此检查。