Библиотека, которая подрывает контроль доступа Java и позволяет мне получить доступ к закрытым переменным-членам? - PullRequest
2 голосов
/ 28 октября 2008

Может ли anoyne порекомендовать хорошую библиотеку, которая позволит мне легко читать / писать приватные поля члена класса? Я просматривал Apache Commons, но не мог этого увидеть. Я должен быть слепым?

Редактировать: Задавая вопросы на границе законности, всегда задавайте вопросы "почему"? Я пишу несколько плагинов javarebel для горячих игр. Доступ к закрытым переменным - это только шаг 1. Возможно, мне даже придется заменить реализации некоторых методов.

Ответы [ 3 ]

7 голосов
/ 28 октября 2008

В большинстве случаев Java Reflection решает проблему:

Пример:

public class Foo {

    /**
     * Gets the name Field.
     * 
     * @return the name
     */
    public final String getName() {
        return name;
    }

    /**
     * Sets the name Field with the name input value.
     * 
     * @param name the name to set
     */
    public final void setName(String name) {
        this.name = name;
    }

    private String name;

}

Теперь код отражения:

import java.lang.reflect.Field;
....

Foo foo = new Foo();
foo.setName("old Name");
String fieldName = "name";
Class class1 = Foo.class;

try {

    System.out.println(foo.getName());

    Field field = class1.getDeclaredField(fieldName);

    field.setAccessible(true);

    field.set(foo, "My New Name");

    System.out.println(foo.getName());

} catch (NoSuchFieldException e) {
    System.out.println("FieldNotFound: " + e);
} catch (IllegalAccessException e) {
    System.out.println("Ilegal Access: " + e);
}

UPDATE:

Стоит отметить, что SecurityManager может помешать этому подходу. - Дэн Дайер

3 голосов
/ 28 октября 2008

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

Тем не менее, вы можете получить доступ к большинству вещей через пакет java.lang.reflect.

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

1 голос
/ 28 октября 2008

Классы и методы пакета java.lang.reflect разрешают этот доступ в определенных пределах.

См. java.lang.reflect

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