我需要通过反射执行一些方法
执行方法
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)
我做错了什么?
答案 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);