Доступ к закрытым методам через шаблоны - PullRequest
0 голосов
/ 13 декабря 2011

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

Ответы [ 5 ]

2 голосов
/ 13 декабря 2011

Следующий код показывает, как получить доступ к такому полю:

Field privateStringField = PrivateObject.class.
        getDeclaredField("privateString");

privateStringField.setAccessible(true);
String fieldValue = (String) privateStringField.get(privateObject);

То же самое можно сделать и в методе. Но в качестве шаблона лучше упаковать его в метод статической утилиты, такой как ReflectionAccessor.accessField(Class class, Object object, String fieldName).

1 голос
/ 13 декабря 2011

Если часть классов, к которым вам нужен доступ, - это protected, вы можете получить к ней доступ с помощью наследования.
Вы также можете получить доступ к защищенным частям через те классы, которые делают иметь доступ к защищенному коду.

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

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

0 голосов
/ 13 декабря 2011

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

Я думаю, что мне нужно вымыть руки после ввода этого.

0 голосов
/ 13 декабря 2011

Вы можете использовать адаптер класса. Адаптер класса будет производным от классов Legacy и будет предоставлять методы открытого интерфейса, которые будут вызывать ваши защищенные методы. Ваш клиент вызовет открытые методы адаптера классов, которые будут внутренне вызывать ваши унаследованные классы.

0 голосов
/ 13 декабря 2011

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

Вы хотите нарушить инкапсуляцию классов, и нет никакого шаблона проектирования, который бы помог вам в этом.Только грязные размышления зовут.

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