反射。执行带参数的非静态方法
Reflection. Executing non-static method with parameters
我需要通过反射执行一些方法
执行方法
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)
我做错了什么?
方法声明 someMethod
使用基本 int
参数,因此将获取方法的行更改为以下内容以使用 int
class 而不是 Integer
class:
clazz.getDeclaredMethod("someMethod", int.class, int.class, String.class, int.class);
class 文字 Integer.class
表示 Integer
class,而不是 int
原始数据类型。查找方法时,反射不会执行从 Integer
转换为 int
.
的拆箱转换
使用Integer.TYPE
表示int
原始类型。
The Class
instance representing the primitive type int
.
Method method = clazz.getDeclaredMethod("someMethod", Integer.TYPE, Integer.TYPE, String.class, Integer.TYPE);
您还可以使用 class 文字 int.class
,如 Section 15.8.2 of the JLS 所述:
A class literal is an expression consisting of the name of a class, interface, array, or primitive type, or the pseudo-type void
, followed by a '.' and the token class
.
(大胆强调我的)
我需要通过反射执行一些方法
执行方法
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)
我做错了什么?
方法声明 someMethod
使用基本 int
参数,因此将获取方法的行更改为以下内容以使用 int
class 而不是 Integer
class:
clazz.getDeclaredMethod("someMethod", int.class, int.class, String.class, int.class);
class 文字 Integer.class
表示 Integer
class,而不是 int
原始数据类型。查找方法时,反射不会执行从 Integer
转换为 int
.
使用Integer.TYPE
表示int
原始类型。
The
Class
instance representing the primitive typeint
.
Method method = clazz.getDeclaredMethod("someMethod", Integer.TYPE, Integer.TYPE, String.class, Integer.TYPE);
您还可以使用 class 文字 int.class
,如 Section 15.8.2 of the JLS 所述:
A class literal is an expression consisting of the name of a class, interface, array, or primitive type, or the pseudo-type
void
, followed by a '.' and the tokenclass
.
(大胆强调我的)