java.lang.reflect包周围有java反射API吗?

时间:2010-06-21 22:42:17

标签: java reflection

许多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 个答案:

答案 0 :(得分:6)

目前还不清楚你要做什么,但是Apache Commons Lang提供了许多方便的实用程序类,使反射变得不那么麻烦,例如MethodUtilsFieldUtils和{ {3}}。这些通常提供单行来抽象出通常庞大的原始反射代码。

正如@Lauri指出的那样,ConstructorUtils也可用,提供更多高级功能,例如在对象之间复制属性。

答案 1 :(得分:2)

另见java.beans.Expression和java.beans.Statement。

答案 2 :(得分:2)

Apache Commons Lang就像它一样直截了当。还有Whitebox是PowerMock的Reflection Helper - 这是wiki的快速摘要。

  

快速摘要

     
      
  1. 使用Whitebox.setInternalState(..)   设置实例的私有成员或   类。
  2.   
  3. 使用   获取一个Whitebox.getInternalState(..)   实例的私有成员或   类。
  4.   
  5. 使用Whitebox.invokeMethod(..)   调用一个私有方法   实例或类。
  6.   
  7. 使用   Whitebox.invokeConstructor(..)来   用a创建一个类的实例   私人建设者。
  8.   

我比ACL更喜欢它,因为您不必明确表示字段和方法的static

答案 3 :(得分:1)

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

答案 4 :(得分:1)

我不知道,但是如果你发现自己使用标准的Java反射API很多,那么你可能对设计和实现Java程序的方式不太正确。

Java主要是作为静态类型语言设计的,并且在以这种方式使用时效果很好。虽然动态类型和(特别是)反射可以帮助您摆脱困难,但限制其使用通常是一个好主意,因为:

  • 它们会降低性能,
  • 它们使您的源代码更复杂,更不易阅读,
  • 他们使你的代码更脆弱。

隐藏库层或类似Sping的框架内的反射可解决可读性问题,但不会解决性能或脆弱性问题。 (还有其他方法解决所有问题......但是如果没有更多关于你为什么要做这么多反思性编程的信息,就不清楚它们是否相关。)

答案 5 :(得分:1)

最方便的是jOOR,您的代码变为:

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

答案 6 :(得分:1)

对于 Spring Framework 用户。有一些实用程序类可以更容易地使用反射:

  • org.springframework.util.ReflectionUtils
  • org.springframework.util.ClassUtils
  • org.springframework.core.annotation.AnnotationUtils
  • org.springframework.util.TypeUtils