Альтернативы отражения интерфейса Java - PullRequest
2 голосов
/ 04 февраля 2011

Я разрабатываю приложение, которое использует интерфейс Java как больше , чем интерфейс Java, т. Е. Во время выполнения пользователь должен иметь возможность перечислять доступные методы в классе интерфейса, что можетбыть чем-либо:

private Class<? extends BaseInterface> interfaceClass.

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

Мой вопрос: поддерживает ли Java«Интерфейсная» архитектура предоставляет мне какой-либо метод для просмотра и вызова методов без использования Reflection API?

Хотелось бы, чтобы было что-то вроде этого (может быть, есть):

private Interface<? extends BaseInterface> interfaceAPI;

public void someMethod(){
 interfaceAPI.listMethods();
 interfaceAPI.getAnnotations();
}

Может быть, естькакой-то способ использовать обобщенные типы для достижения того, что я хочу?

Спасибо,

Phaedrus

Ответы [ 7 ]

5 голосов
/ 04 февраля 2011

Это именно то, для чего был построен Reflection.

1 голос
/ 04 февраля 2011

Взгляните на Apache Commons BeanUtils . Это отличная библиотека для программного обнаружения методов и свойств объекта легко (т.е. без написания низкоуровневого кода отражения). Я использовал его в нескольких проектах. Он также предоставляет более простой API для доступа к этим членам объекта после их обнаружения. PropertyUtils и MethodUtils - хорошие места для начала.

1 голос
/ 04 февраля 2011

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

1 голос
/ 04 февраля 2011

У меня такой вопрос: предоставляет ли архитектура «Интерфейс» Java какой-либо метод, позволяющий мне просматривать и вызывать методы без использования Reflection API?

а) Нет, отражение - единственный способ сделать это

б) не делай этого вообще. Если вы хотите динамический язык, используйте Groovy. Его синтаксис (может быть) почти идентичен Java, но в него встроена большая часть этой функциональности. (Многие другие языки также будут работать, но Groovy ближе всего к Java при сравнении синтаксиса)

0 голосов
/ 04 февраля 2011

Отражение с аннотациями работает Отлично

for (Method m : interfaceClass.getMethods()) {
         if (m.isAnnotationPresent(UIf.class)) {
            UIf x = m.getAnnotation(UIf.class);
            addDefinedCommand( new CommandDef(
                    interfaceClass, 
                    u, 
                    x.name().isEmpty() ? m.getName() : x.name(), 
                    x.description()) 
            );
         }
 }
0 голосов
/ 04 февраля 2011

Хотя здесь нет способа обойти отражение, его можно сделать относительно безболезненным, если вы используете аннотации для обозначения вызываемых методов. Примером такого подхода в работе является набор javax.jws для веб-сервисов. Используемые там идеи могут быть действительно полезными, например, вы можете определить отображаемое имя для каждого из ваших методов / параметров.

0 голосов
/ 04 февраля 2011

К сожалению, похоже, что отражение - единственный путь.Прискорбно, потому что рефлексия не только медленнее, но и программирование и поддержка - это хлопот.Поэтому я предлагаю вам использовать библиотеку apache bean util.(в частности methoddutils .)

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