Существует ли API отражения java вокруг пакета java.lang.reflect? - PullRequest
2 голосов
/ 22 июня 2010

Многие проекты Java используют рефлексию. Интересно, есть ли библиотека отражений, которая облегчает использование java.lang.reflect.

Мы могли бы использовать это как:

 Reflected object = new Reflected( new Object() {
        String name="Oscar";
        String lastName="Reyes";
        String reverseName(){
            return new StringBuilder(name+lastName)
                .reverse()
                .toString();
        }
        int nameLength() {
            return (name+lastName).length();
        }
    });
    String name = object.getString("name");
    object.set("name", "Mr. Oscar");
    String reversed = ( String ) object.exec("reverseName");
    int count       = ( Integer ) object.exec("nameLength");

.... 
UnknownLibraryObject reflectionMadeEasy 
         = new UnknownLibraryObject( .... );// initialize with an object from somewhere 

String someString = ( String ) reflectionMadeEasy.get("stringPropertyFromTheReflectedObject");
int someInteger   = ( String ) reflectionMadeEady.execute("someMethodFromReflectedObject", 1,2,3 );// with args.

Все ли проекты, использующие отражение, начинаются с нуля, или для этого уже есть библиотека?

Ответы [ 7 ]

6 голосов
/ 22 июня 2010

Непонятно, что вы пытаетесь сделать, но Apache Commons Lang предоставляет ряд удобных служебных классов, чтобы сделать отражение немного менее громоздким, например MethodUtils, FieldUtils и ConstructorUtils.Как правило, они обеспечивают однострочность для абстрагирования часто громоздкого исходного кода отражения.

Как указал @Lauri, Commons BeanUtils также доступен, предоставляя более высокоуровневые функции, такие как копирование.свойства между объектами.

2 голосов
/ 22 июня 2010

Apache Commons Lang настолько прост, насколько это возможно. Существует также Whitebox, который является помощником отражения PowerMock - вот краткий обзор вики.

Краткое резюме

  1. Используйте Whitebox.setInternalState (..) для установить закрытый член экземпляра или учебный класс.
  2. Использование Whitebox.getInternalState (..), чтобы получить частный член экземпляра или учебный класс.
  3. Использовать Whitebox.invokeMethod (..) вызвать частный метод экземпляр или класс.
  4. Использование Whitebox.invokeConstructor (..) для создать экземпляр класса с Частный конструктор.

Мне нравится это лучше, чем ACL, так как вам не нужно явно указывать static поля и методы.

2 голосов
/ 22 июня 2010

См. Также java.beans.Expression и java.beans.Statement.

1 голос
/ 19 июля 2017

Для Spring Framework пользователей.Есть несколько служебных классов для более удобной работы с отражением:

  • org.springframework.util.ReflectionUtils
  • org.springframework.util.ClassUtils
  • org.springframework.core.annotation.AnnotationUtils
  • org.springframework.util.TypeUtils
1 голос
/ 27 июня 2017

Наиболее удобным является jOOR , с ним ваш код становится:

Reflect.on(anyObject).field("stringPropertyFromTheReflectedObject").get() Reflect.on(anyObject).call("someMethodFromReflectedObject", 1,2,3).get()

1 голос
/ 22 июня 2010

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

Java в первую очередь предназначенакак статически типизированный язык, и очень хорошо работает при таком использовании.Хотя динамическая типизация и (особенно) рефлексия могут помочь вам справиться с трудными проблемами, обычно рекомендуется ограничить их использование, поскольку:

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

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

1 голос
/ 22 июня 2010

Spring Framework содержит несколько помощников, ничем не отличающихся от Commons Lang / BeanUtils ...

http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/util/ReflectionUtils.html

http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/beans/BeanUtils.html

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

Вы даже можете обнаружить, что действительно ищете среду, например Spring, для управления вашими объектами ... hth

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