因为平时用反射很少,之前一次面试被问到反射这块的一个问题,很简单,当时给了个不是很确切的答案,回家之后也忘了去找出这个问题的答案,今天手头上的工作比较闲,就把之前的那个问题给解决下。
被问到的是,我只知道一个类和他其中的一个方法,不知道方法的参数情况,我怎么定位到这个方法?这个问题我想到的就是反射获取这个类的所有方法,然后去找它的参数(当时不确定有方法能获取参数类型),在反过来调用这个方法。然后被问到如何获取参数类型和个数,这个我就没有回答上来。后来才知道是有方法能够获取的,所以今天我就把我写的一个测试的代码贴下面,代码很简单所以注释就不多,应该都能看懂,不懂得查查API或者百度一下,我还是比较建议大家查API的。
package test002;
import java.lang.reflect.Method;
public class Test1 {
public static void main(String[] args) {
try {
Class<?> clazz = Class.forName("test002.test01");
//获取本类的所有方法,存放入数组
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
System.out.println("方法名:"+method.getName());
//获取本方法所有参数类型,存入数组
Class<?>[] getTypeParameters = method.getParameterTypes();
if(getTypeParameters.length==0){
System.out.println("此方法无参数");
}
for (Class<?> class1 : getTypeParameters) {
String parameterName = class1.getName();
System.out.println("参数类型:"+parameterName);
}
System.out.println("****************************");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
class test01 {
public test01(){
System.out.println("我是tset01");
}
public void t1(){}
public void t2(String sss){}
public void t3(Integer integer,Boolean boo,test02 t){}
}
class test02{}
因为是随手写的,为的是以后方便查看,所以也就没有做过多的格式调整。
结果如下:
这个可以找到所有的方法和这个方法所有的参数类型,这样的话想要定位到其中某一个方法,只需要做一个判断过滤一下就能够获取所需要的方法的参数类型及个数,就可以调用这个方法了。这只是个简单的方法使用,以后有机会再多写点反射的,在平时的使用中作用还是蛮大的。