许多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.
每个使用反射的项目是从头开始还是已经有了库?
答案 0 :(得分:6)
目前还不清楚你要做什么,但是Apache Commons Lang提供了许多方便的实用程序类,使反射变得不那么麻烦,例如MethodUtils
,FieldUtils
和{ {3}}。这些通常提供单行来抽象出通常庞大的原始反射代码。
正如@Lauri指出的那样,ConstructorUtils
也可用,提供更多高级功能,例如在对象之间复制属性。
答案 1 :(得分:2)
另见java.beans.Expression和java.beans.Statement。
答案 2 :(得分:2)
Apache Commons Lang就像它一样直截了当。还有Whitebox
是PowerMock的Reflection Helper - 这是wiki的快速摘要。
快速摘要
- 使用Whitebox.setInternalState(..) 设置实例的私有成员或 类。
- 使用 获取一个Whitebox.getInternalState(..) 实例的私有成员或 类。
- 使用Whitebox.invokeMethod(..) 调用一个私有方法 实例或类。
- 使用 Whitebox.invokeConstructor(..)来 用a创建一个类的实例 私人建设者。
醇>
我比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 用户。有一些实用程序类可以更容易地使用反射: