Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以将什么作为第二个参数传递给java反射';getMethod是否表示没有参数?_Java_Reflection - Fatal编程技术网

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

我可以将什么作为第二个参数传递给java反射';getMethod是否表示没有参数?,java,reflection,Java,Reflection,我正在做一些奇怪的反射工作,以便在类中包装一大堆方法。建议使用null作为解决方案,但是它失败了,并且没有出现任何方法异常 public Method getMethod(String name, Class[] parameterTypes) throws NoSuchMethodException, SecurityException 如果paramet

我正在做一些奇怪的反射工作,以便在类中包装一大堆方法。建议使用null作为解决方案,但是它失败了,并且没有出现任何方法异常

 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!
    }
}
private T invokeWrappedFunction(对象实例、字符串方法名、对象…参数){
试一试{
方法m=instance.getClass().getMethod(方法名,(args==null?null:args.getClass());
返回(T)m.invoke(实例,args);
}捕获(例外e){
//这是一个例子,你很幸运,我甚至承认了例外!
}
}

现在,最终会有很多额外的功能在那里,实例不是一个未知的类型,所以我可以做一些关于失败之类的有用的事情。真正的问题是如何让
getMethod
工作?

我认为您通过了一个
新类[0]

e、 g

增加

也许我没有理解完整的问题。如果问题不是无参数版本。但是对于args版本,如果args是所有相同类型的数组,则可以处理它。如果他们是不同的类型,我想你有麻烦了

首先,验证args不为null,并且它是一个数组,然后调用Class.getComponentType(),例如


根据这些评论,我添加了一个答案来说明我的意思

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!
    }
}

如果您试图反映一个方法,该方法希望获取一个
I
,但您向它传递了一个
C
,那么
getMethod(…)
将抛出一个异常,而不是返回您想要的方法,因为
C
不等于
I

更仔细地看,我可能还有
args.getClass()的问题
所以也许我的聪明是傲慢:(你确实对
args.getClass()
有问题。它将返回对象数组的类,该数组是
类的一个实例,而不是
类[]
。你需要构造一个新的
数组,并用每个
arg.getClass()填充它)
。尽管如此,我不确定这是否适用于任何多态性/子类化,因为
getClass()
可能与形式参数列表不对应。如果该方法采用了一组不同类型的参数,我认为您运气不好。如果它采用了相同类型的数组,您可以验证args是否真的是数组,然后执行
Class.getComponentType()
请参见下面的更新答案。我认为类型擦除可能会引起问题——您试图调用的签名是什么?(顺便说一句,
null
工作正常。)请参阅。但是一些关于泛型类外观的附加信息可能会有所帮助。哎哟,许多参数恰好是接口,所以我被卡住了。不过感谢您的时间!请记住:您可以重新创建Java选择正确方法的方法(测试
isAssignableFrom()
或其他方法)。我不确定JVM是如何选择方法的,但我肯定它在某个地方有文档记录。您需要使用
getMethods()
并找到最合适的匹配项,但这并不漂亮。您可以使用@mange suggestion,再加上某种映射,将您的具体类映射到神奇的接口,您需要获得正确的方法。当然,如果它们实现了多个接口(很可能)它可能会很快变得非常混乱。我想你可以遍历它们的所有接口,直到没有异常为止,但这似乎有点过分。谢谢,最后我将只在包装器中维护20个左右非常相似的函数。这些东西太难理解了,实际上维护起来并不容易。
if (args != null) {
   Class c = args.getClass();
   if (c.isArray()) 
      Class arrayClass = c.getComponentType();
   // do something here...
}
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 ...
    }
}