为什么反射找不到方法?

时间:2012-06-09 10:03:05

标签: 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 + (String)str);
        }
        return val;
    }
}

检索方法:

try
{
    Class<?> c = Class.forName("test1.Test1");
    Method[] allMethods = c.getDeclaredMethods();
    for (Method m : allMethods) {
        String mname = m.getName();
        System.out.println(mname);
    }

    Method m = c.getMethod("getCompositeMessage");
    m.setAccessible(true);
    Object o = m.invoke(c, "777777777777777777777777");
    System.out.println(m);
}
catch (Exception e)
{
    // TODO Auto-generated catch block
    e.printStackTrace();
}

输出:

getCompositeMessage
java.lang.NoSuchMethodException: test1.Test1.getCompositeMessage()
at java.lang.Class.getMethod(Unknown Source)
at test1.Main.main(Main.java:25)

但方法的名称完全一样!为什么我收到NoSuchMethodException? 感谢。

2 个答案:

答案 0 :(得分:8)

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

该方法定义为:

getCompositeMessage(Type... strings)

但你正在寻找

getCompositeMessage()

没有参数。

您需要使用:

c.getMethod("getCompositeMessage", Object[].class);

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

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

 Object o = m.invoke(new Test1<String>(), new Object[] {
          new String[] {"777777777777777777777777"}});

接下来的问题是你想要输出方法的结果而不是下一行中的method-object:

System.out.println(o);

答案 1 :(得分:3)

您可以使用

找到它
Test1.class.getDeclaredMethod("getCompositeMessage", Type[].class);

(如果Type是一个类或接口,那将是真的,因为它是你正在寻找的通用参数:)

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

你得到的错误是因为第一个参数需要是一个实例,而不是类Object。

错误:

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"};