[英]Using Reflections: how to test method
我最近在java中看过Reflections,我想出了一个简单的例子
Reflection.java
import java.lang.reflect.*;
public class Reflection{
}
public static void main(String args[])
{
try {
Class cls = Class.forName("Method");
Method methlist[]
= cls.getDeclaredMethods();
for (int i = 0; i < methlist.length;
i++) {
Method m = methlist[i];
System.out.println("name
= " + m.getName());
System.out.println("decl class = " +
m.getDeclaringClass());
Class pvec[] = m.getParameterTypes();
for (int j = 0; j < pvec.length; j++)
System.out.println("
param #" + j + " " + pvec[j]);
Class evec[] = m.getExceptionTypes();
for (int j = 0; j < evec.length; j++)
System.out.println("exc #" + j
+ " " + evec[j]);
System.out.println("return type = " +
m.getReturnType());
System.out.println("-----");
}
}
catch (Throwable e) {
System.err.println(e);
}
}
}
Method.java
public class Method {
private int f1(
Object p, int x) throws NullPointerException
{
if (p == null)
throw new NullPointerException();
return x;
}
从上面的例子我可以返回Method.java
所有信息,如下所示
name = f1
decl class = class Method
param #0 class java.lang.Object
param #1 int
exc #0 class java.lang.NullPointerException
return type = int
-----
name = main
decl class = class method1
param #0 class [Ljava.lang.String;
return type = void
-----
但我的问题是,有没有办法从Reflection.java
测试Method.java
int x = cls.getMethod("f1", Object = anObject, Integer.TYPE = 2 )
System.out.println(x);
控制台应打印2,因为f1传递了一个对象?
查看java.lang.reflect.Method
的Javadoc 。 你想要方法invoke()
;
Method m = ...
Object result = m.invoke(objectToCallMethodOn, firstArgument, secondArgument);
int x = ((Integer) result).intValue();
您需要创建Method
的实例并使用这两个参数调用私有方法f1
。 它将返回一个对象。 您的代码中存在一些陷阱,但这是一个有效的解决方案(注意:我将您的类Method
重命名为MyMethod
以避免名称冲突:
Method f1Method = MyMethod.class.getDeclaredMethod("f1", Object.class, int.class);
f1Method.setAccessible(true);
int result = (Integer) f1Method.invoke(new MyMethod(),
new Object[]{new Object(), 2});
System.out.println(result);
int.class
。 JavaDoc告诉我们, 如果值具有基本类型,则首先将其适当地包装在对象中 。 所以我们将收到一个Integer
实例。 注:该Method
类我指的是该Method
在JDK类 ,而不是一个在你的榜样
您已经能够从Class
对象中找到Method
。 您现在可以使用Method#invoke
方法来调用某个对象上的方法
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.