Java - определить код, который изменяет закрытый член класса? - PullRequest
1 голос
/ 29 марта 2011

Используя Eclipse или IntelliJ, как найти весь код, который может изменить закрытый член класса (тип Object)?

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

Ответы [ 6 ]

1 голос
/ 29 марта 2011

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

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

1 голос
/ 29 марта 2011

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

Я не уверен, что правильно вас понял, но вы не можете изменить ссылку, возвращаемую getMyMember() напрямую, только объект, на который ссылаются.

1 голос
/ 29 марта 2011

В Eclipse щелкните правой кнопкой мыши на приватном участнике и выберите «Открыть иерархию вызовов».

Обратите внимание, что закрытый член является ссылкой и не может быть изменен вне класса - с некоторыми исключениями, такими как JNI и рефлексия.

Можете ли вы вернуть объект-оболочку из геттера?

1 голос
/ 29 марта 2011

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

0 голосов
/ 30 марта 2011

Как уже упоминалось выше, вопросы частично ошибочны: метод доступа getObject () не позволяет коду вне класса изменять состояние поля.

Если у вас также есть мутатор setObject (), и вы хотите узнать, по каким путям кода новые значения будут «перетекать» в поле, попробуйте «Анализировать .. Поток данных в это» в IntelliJ.

См. Это сообщение в блоге IntelliJ для получения дополнительной информации: http://blogs.jetbrains.com/idea/2009/08/analyzing-dataflow-with-intellij-idea/

0 голосов
/ 29 марта 2011

В Eclipse: выберите переменную или закрытый член, щелкните правой кнопкой мыши, ссылки и рабочее пространство или используйте сочетание клавиш ctrl + shift + g для переменной

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