我正在做一些奇怪的反射的东西,以避免在一个类中包装一大堆的方法。java文档建议使用null作为解决方案,但是使用NoSuchMethodException会失败。
public Method getMethod(String name,
Class[] parameterTypes)
throws NoSuchMethodException,
SecurityException
如果parameterTypes为null,则将其视为空数组。
I'm try:
private <T> T invokeWrappedFunction(Object instance, String methodName, Object... args) {
try{
Method m = instance.getClass().getMethod(methodName, (args == null ? null : args.getClass()));
return (T) m.invoke(instance, args);
} catch(Exception e) {
//This is an example, you're lucky I even acknowledged the exception!
}
}
现在最终会有很多额外的功能在那里和实例不是一个未知类型,所以我可以做一些有用的东西在失败等。真正的问题是我如何让getMethod
工作?
根据评论,我添加了一个答案来说明我的意思。
private <T> T invokeWrappedFunction(Object instance, String methodName, Object... args) {
Class[] classes = null;
if (args != null) {
classes = new Class[args.length];
for (int i = 0; i < args.length; ++i) {
classes[i] = args[i].getClass();
}
}
try {
Method m = instance.getClass().getMethod(methodName, classes);
return (T) m.invoke(instance, args);
} catch(Exception e) {
//This is an example, you're lucky I even acknowledged the exception!
}
}
但在某些情况下,仍然不起作用。如果你传入的对象是形式形参类型的子类,它将不起作用。
例如:interface I {
void method();
}
class C implements I {
public void method() {
... code ...
}
}
如果你试图反映一个期望采取I
的方法,但你传递它一个C
,那么getMethod(...)
将抛出一个异常,而不是返回你想要的方法,因为C
不等于I
。
我认为你通过了new Class[0];
。
final static Class[] NO_ARGS = new Class[0];
Method m = Method m = instance.getClass().getMethod(methodName, NO_ARGS);
添加也许我没有完全理解你的问题。如果问题不是无参数版本。但是在with args版本中,如果args是一个的数组,所有的args都是相同类型的,你可以处理它。如果它们是不同的类型,我想你有麻烦了。
首先,验证args不为空并且它是一个数组,然后调用Class.getComponentType(),例如
if (args != null) {
Class c = args.getClass();
if (c.isArray())
Class arrayClass = c.getComponentType();
// do something here...
}