Java 为什么反射找不到方法?

Java 为什么反射找不到方法?,java,class,reflection,types,methods,Java,Class,Reflection,Types,Methods,但方法的名称完全相同!为什么我没有收到任何异常? 谢谢。修复拼写错误后,您仍在寻找错误的方法: public class Test1<Type> { public Type getCompositeMessage(Type... strings) { Type val = (Type) ""; for (Type str : strings) { val = (Type) ((String)val + (Str

但方法的名称完全相同!为什么我没有收到任何异常?
谢谢。

修复拼写错误后,您仍在寻找错误的方法:

public class Test1<Type>
{
    public Type getCompositeMessage(Type... strings)
    {
        Type val = (Type) "";

        for (Type str : strings) {
            val = (Type) ((String)val + (String)str);
        }
        return val;
    }
}
该方法定义为:

getCompositeMessage
java.lang.NoSuchMethodException: test1.Test1.getCompositeMessage()
at java.lang.Class.getMethod(Unknown Source)
at test1.Main.main(Main.java:25)
但是你在找

getCompositeMessage(Type... strings)
没有参数

您需要使用:

getCompositeMessage()
下一个问题是调用invoke,您传递的是类引用,而不是应该调用方法的对象

下一个错误是没有将正确的参数传递给函数:

c.getMethod("getCompositeMessage", Object[].class);
你可以使用

System.out.println(o);
如果类型是类或接口,则为真,因为它是您要查找的通用参数:

Test1.class.getDeclaredMethod("getCompositeMessage", Type[].class);
您得到的错误是由于第一个参数必须是实例,而不是类对象

错:

Test1.class.getDeclaredMethod("getCompositeMessage", (Object) Object[].class);
对:

Object o = m.invoke(c /* c is a class Object, but it must be an instance */,
                    "777777777777777777777777" /* this must be an array */);

类型[]。类是非法的,因为泛型在Java中的工作方式。@HendrikBrummermann哦,对不起,未意识到该类型是泛型参数java.lang.IllegalArgumentException:对象不是sun.reflect.NativeMethodAccessorImpl.invoke0Native方法在sun.reflect.NativeMethodAccessorImpl.invokeUnknown源在sun.reflect.DelegatingMethodAccessorImpl.invokeUnknown源的声明类的实例java.lang.reflect.Method.invokeUnknown源代码位于test1.Main.mainMain.java:27AFAIK它需要添加方法的参数,但在本例中它是泛型的。对象或对象[]。类不起作用。@SeanPatrickFloyd,java对被调用方法和invoke方法中的varargs感到困惑。您需要将Object[]强制转换为Object,以便使用vararg版本的invoke,或者将该数组放入另一个Object[]数组中,以便使用老式的invoke。
Test1.class.getDeclaredMethod("getCompositeMessage", (Object) Object[].class);
Object o = m.invoke(c /* c is a class Object, but it must be an instance */,
                    "777777777777777777777777" /* this must be an array */);
Type1<String> t = new Type1<String>();
Object o = m.invoke(t, new Object[]{"foo", "bar"};