作为第二个参数,我可以传递给java反射的getMethod来表示没有参数?

时间:2012-01-05 00:54:51

标签: java reflection

我正在做一些奇怪的反思,以便在一个类中包装一大堆方法。 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工作?

2 个答案:

答案 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