springside / springside4

A Spring Framework based, pragmatic style JavaEE application reference architecture.
http://www.springside.io
Apache License 2.0
5.72k stars 2.91k forks source link

关于ReflectionUtil折腾反馈 #559

Open zhugw opened 7 years ago

zhugw commented 7 years ago

ReflectionUtil 使用反馈

单元测试测试一个私有方法 方法签名如下所示:

private List<Bar> getBarList(List<Foo> fooList, Long Id) 

刚开始直接调用

ReflectionUtil.invokeMethod(obj, "getBarList", fooList, 1L);

报错: java.lang.IllegalArgumentException: Could not find method [getBarList] on target [XXX] 断点调试发现实际参数类型用的是ArrayList

于是显式指定方法参数类型

ReflectionUtil.invokeMethod(obj, "getBarList", new Object[]{ fooList, 1L}, new Class[]{List.class,Long.class});

还是不行 断点调试发现下面的代码将Long.class --> long

// 处理原子类型与对象类型的兼容
ClassUtil.wrapClassses(theParameterTypes);

最后只好使用下面的写法解决了该问题

ReflectionUtil.invokeMethodByName(obj, "getBarList", new Object[]{ fooList, 1L});

反馈

我觉得如果调用者显式指定了参数类型 如下所示 直接使用好了 不用多做额外的处理了吧 如包装类型 --> 基本类型

ReflectionUtil.invokeMethod(obj, "getBarList", new Object[]{ fooList, 1L}, new Class[]{List.class,Long.class});
calvin1978 commented 7 years ago

谢谢反馈,我看看

calvin1978 commented 6 years ago

已修复,多用Apache Commmon Lang里的类