2014-08-29 3 views
4

Пример взята из книги безопасности Java O'Reilly.Доступ к закрытым полям без байтово-верификатора

Есть два класса 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 на приватный и перекомпилирует только класс Card.

Запуск теста (тест Java) производит следующий вывод.

Ваша карта - 123234.

Так он работал, даже не выключая байткодом верификатор (Хотя автор говорит, что если бы мы не байт-кода верификатор, он будет работать).

Теперь я делаю то же самое с использованием Java 1.6. Запуск класса Test производит IllegalAccessError, даже если я начинаю его с -noverify.

Вопросов:

1) Есть ли у него что-нибудь сделать с байткодом испытателем. Если это не так, кто произвел ошибку.

2) Была ли это ошибкой в ​​предыдущих версиях Java?

+3

Вы знаете, что 1.2 был выпущен в 1998 году, не так ли? –

+2

Итак? :) Как это противоречит моему вопросу :) –

+0

Я имею в виду, что они определенно работали над безопасностью байт-кода с 1.2, и кто волнует, есть ли у 1.2 в нем какие-то ошибки? –

ответ

3

Да, это была ошибка старого верификатора. Похоже, это был один:

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

Не ясно из истории (публичная) ошибка, когда именно она была фиксированной, но я подозреваю, что это было установлено давно.


Если это ошибка, и что это нужно сделать с байткодом проверяющего

Байткода верификатор должны проверить, что класс не пытается ссылаться на отдельные поля другого класс. Эта проверка должна произойти, когда классы загружаются JVM.

+0

Почему не отключил верификатор в 1.6 помочь получить доступ к полю? –

+1

Ошибка закрыта как дубликат, по-видимому, из http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4066506. Это просто относится к локально загруженным классам и, по-видимому, фиксировалось в 1.2 beta после выпуска 1.2 fcs ... –

+0

@ TomHawtin-tackline - Вы можете видеть это, но простые смертные не могут :-) –

Смежные вопросы