反射。使用参数执行非静态方法

时间:2015-01-22 19:01:02

标签: java android reflection

我需要通过反射执行一些方法

执行方法

public void someMethod(int value1, int value2, String str, int value3)
{
    try
    {
        // some code
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

这是执行代码

public static void execute()
{
    try
    {
        String          className = "some.class";
        String          classPath = "some.pack.name" + ":" + "some.class";
        PathClassLoader loader    = new dalvik.system.PathClassLoader(classPath, ClassLoader.getSystemClassLoader());

        Class           clazz     = Class.forName(className, true, loader);
        Method          method    = clazz.getDeclaredMethod("someMethod", Integer.class, Integer.class, String.class, Integer.class); 
        Object          object    = clazz.newInstance();

        method.invoke(object, 1, 2, "str", 3);
    }
    catch (Throwable e) {e.printStackTrace();}
}

但我收到错误

01-22 21:44:52.286: W/System.err(10877): java.lang.NoSuchMethodException: someMethod [class java.lang.Integer, class java.lang.Integer, class java.lang.String, class java.lang.Integer]
01-22 21:44:52.286: W/System.err(10877):    at java.lang.Class.getConstructorOrMethod(Class.java:472)
01-22 21:44:52.286: W/System.err(10877):    at java.lang.Class.getDeclaredMethod(Class.java:640)

我做错了什么?

2 个答案:

答案 0 :(得分:2)

类文字Integer.class表示Integer类,而不是int原始数据类型。查找方法时,反射不会执行拆箱转换以从Integer转换为int

使用Integer.TYPE表示int基元类型。

  

表示基本类型Class的{​​{1}}实例。

int

您还可以使用类文字Method method = clazz.getDeclaredMethod("someMethod", Integer.TYPE, Integer.TYPE, String.class, Integer.TYPE); 作为Section 15.8.2 of the JLS个州:

  

类文字是一个表达式,由类,接口,数组或基本类型的名称或伪类型int.class组成,接着是'。'和令牌void

(大胆强调我的)

答案 1 :(得分:1)

方法声明someMethod使用原始int参数,因此将获取方法的行更改为以下内容以使用int类而不是Integer类:< / p>

clazz.getDeclaredMethod("someMethod", int.class, int.class, String.class, int.class);