Есть ли какая-либо разница между частными, общедоступными ключевыми словами пакета во время выполнения? - PullRequest
7 голосов
/ 15 марта 2012

Я знаю, что у Java есть эти ключевые слова serval, чтобы идентифицировать область действия переменной во время разработки, но я хотел бы знать, отличается ли она, когда она находится в производственной среде или просто для интереса кодера?Спасибо.

Ответы [ 4 ]

5 голосов
/ 15 марта 2012

Доступность обеспечивается и во время выполнения.Если какой-то код пытается получить доступ к члену, который ему не нужен, тогда выбрасывается IllegalAccessException или IllegalAccessError.Вот краткая демонстрация:

public class AccessTest {
    public int publicNumber;
    private int secretNumber;
}

public class Client {
    public static void main(String[] args) throws Exception {
        reflection();
        noReflection();
    }

    private static void noReflection() throws IllegalAccessException, NoSuchFieldException {
        int a = new AccessTest().publicNumber;
          //                     ^^^^^^^^^^^^ 
          // To be changed to secretNumber in bytecode editor after compilation

        System.out.println("Number read: " + a);
    }

    private static void reflection() throws IllegalAccessException, NoSuchFieldException {
        AccessTest instance = new AccessTest();
        AccessTest.class.getDeclaredField("publicNumber").get(instance); // <-- Works
        try {
            AccessTest.class.getDeclaredField("secretNumber").get(instance); // <-- Throws IllegalAccessException
        } catch (IllegalAccessException e) {
            System.out.println("Caught IllegalAccessException");
        }
    }
}

С отражением:

Как есть, вышеприведенная программа выводит:

Caught IllegalAccessException
Number read: 10

Без отражения:

Когда я использую редактор байт-кода для изменения

getfield com/blah/access/AccessTest/publicNumber I

в методе noReflection() на:

getfield com/blah/access/AccessTest/secretNumber I

, вывод будет:

Caught IllegalAccessException
Exception in thread "main" java.lang.IllegalAccessError: tried to access field com.blah.access.AccessTest.secretNumber from class com.blah.access.Client
at com.blah.access.Client.noReflection(Client.java)
at com.blah.access.Client.main(Client.java:12)

Как Майкл упомянул об этомповедение может зависеть от JVM.Я запустил это на

java version "1.6.0_20"
Java(TM) SE Runtime Environment (build 1.6.0_20-b02)
Java HotSpot(TM) 64-Bit Server VM (build 16.3-b01, mixed mode)
5 голосов
/ 15 марта 2012

Нет, JVM фактически проверяет и обеспечивает видимость во время выполнения.

Есть способы обойти это, используя отражение, но SecurityManager может это тоже запретить.

2 голосов
/ 15 марта 2012

Проверки выполняются как во время выполнения, так и во время компиляции. Существует целая масса исключений этого типа, которые могут быть сгенерированы во время выполнения, например IllegalAccessException :

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

1 голос
/ 15 марта 2012

Проверки выполняются во время выполнения (а также во время компиляции). Однако эти проверки, хотя и относительно дорогие, обычно выполняются один раз за вызов, и не имеют большого значения.of are;

  • Если вы обращаетесь к закрытому члену класса в том же файле, необходимо создать метод доступа (так как JVM не разрешает доступ к закрытому члену от другогокласс, вложенный или другой) Это не влияет на производительность так сильно, как вы думаете, так как метод может быть встроен.Что он может сделать, это добавить запутанный метод access$100 в ваш стек вызовов

  • Если вы используете отражение, проверка, кажется, выполняется каждый раз.Если вы используете member.setAccessible(true), это отключает проверку безопасности и может ускорить доступ / вызов, даже если член общедоступен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...