Подтвердить что ты не робот

Почему это разрешено для доступа к частным полям Java через отражение?

Рассмотрим следующий пример:

import java.lang.reflect.Field;

public class Test {

    public static void main(String[] args) {
        C c = new C();
        try {
            Field f = C.class.getDeclaredField("a");
            f.setAccessible(true);
            Integer i = (Integer)f.get(c);
            System.out.println(i);
        } catch (Exception e) {}
    }
}

class C {
    private Integer a =6;
}

Кажется нелогичным, что вам разрешено доступ к закрытым полям классов с отражением. Почему такая функциональность доступна? Разве не "опасно" разрешить такой доступ?

4b9b3361

Ответ 1

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

Ответ 2

Оба getDeclaredField() и setAccessible() фактически проверяются диспетчером безопасности и генерируют исключение, если ваш код не разрешен для этого. Чаще всего вы этого не заметите, потому что код Java часто запускается без администратора безопасности.

Одним из важных исключений являются апплеты, которые всегда работают с менеджером безопасности.

Ответ 3

Да, это не приятно, но это позволяет работать с такими ракурсами, как Java Serialization.

Установка доступного флага в отраженном объекте позволяет сложным приложениям с достаточной степенью привилегий, таким как сериализация объектов Java или другим механизмам сохранения, манипулировать объектами таким образом, который обычно запрещается.

Я полагаю, что функциональность можно отключить с помощью SecurityManager

http://javabeans.asia/2008/10/12/how_to_set_securitymanager_and_java_security_policy_programmatically.html

Ответ 4

Отражение опасно. Период.

Какой смысл ограничивать полезность действительно опасной системы ради столь незначительно повышенной безопасности?

Кроме того, автоматическая сериализация требует возможности "высасывать мозги" из любого класса; игнорирование модификаторов доступа является необходимостью в этом случае.

Ответ 5

Reflection - это полный API для ввода внутри классов. Частные члены и все.

В случаях, когда вы не доверяете запущенному вами коду (апплеты и т.п.), вы можете вообще не использовать код. Подробнее см. этот вопрос.

Ответ 6

От: http://java.sun.com/docs/books/tutorial/reflect/

Отражение обычно используется программами, которые требуют возможности исследовать или изменять поведение среды выполнения приложений, запущенных на виртуальной машине Java.

Это инструмент, позволяющий одним сломать некоторые правила, можно бросить его на ногу или правильно использовать.

Ответ 7

В описание пакета java.lang.reflect:

Классы в этом пакете вместе с java.lang.Class разместить приложения, такие как отладчики, переводчики, инспекторы объектов, класс браузеров и служб, таких как Object Сериализация и JavaBeans, которые необходимы доступ к общественным целевой объект (на основе его времени выполнения класс) или членов, объявленных заданный класс.

Отражение обеспечивает механизм доступа к информации о классах с помощью средств, которые обычно недоступны при регулярном взаимодействии между классами и объектами. Одним из таких способов является доступ к закрытым полям из внешних классов и объектов.

Да, отражение вообще может быть опасным, поскольку оно может выставлять внутренние объекты классов и объектов.

Однако это также очень мощный инструмент, который можно использовать для проверки внутренних объектов классов и объектов, к которым нельзя получить доступ с помощью других стандартных средств.