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



我正在做一些奇怪的反射的东西,以避免在一个类中包装一大堆的方法。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...
}

相关内容

  • 没有找到相关文章

最新更新