我正在做一些奇怪的反思,以便在一个类中包装一大堆方法。 java docs表示null将是解决方案,但它会因NoSuchMethodException而失败。
public Method getMethod(String name,
Class[] parameterTypes)
throws NoSuchMethodException,
SecurityException
如果parameterTypes为null,则将其视为空数组。
首先,我正在尝试:
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
工作?
答案 0 :(得分:1)
我认为你通过了new Class[0];
e.g。
final static Class[] NO_ARGS = new Class[0];
Method m = Method m = instance.getClass().getMethod(methodName, NO_ARGS);
ADDED
也许我不理解完整的问题。如果问题不是no-args版本。但是使用args版本,如果args是一个所有相同类型的数组,你可以处理它。如果他们是不同的类型,我认为你有麻烦。
首先,验证args不为null并且它是一个数组,然后调用Class.getComponentType(),例如
if (args != null) {
Class c = args.getClass();
if (c.isArray())
Class arrayClass = c.getComponentType();
// do something here...
}
答案 1 :(得分:1)
根据评论,我正在添加一个答案来说明我的意思。
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(...)
会抛出异常而不是返回您想要的方法,因为{{1 }}不等于C
。