反射的用处很大,因为可以在某个类、对象在运行时获得这个对象的属性和方法,更改这个类的属性和方法。
曾经在项目中我需要解决一个问题:通过字段来确定他是属于哪个类的,这个时候反射的作用就凸显出来了。
今天这篇文字用来记录如何通过反射动态调用某个类的方法。
参数:
- 要调用的类的全包名
- 要调用的类的方法名
- 要传入的参数集合
/**
* 通用反射方法
* @param classUrl 要调用类的全包名
* @param function 要调用的方法名
* @param args 要传递的参数
* @return
* @throws Exception
*/
public static Object commonReflectMethod(String classUrl,String function,List args) throws Exception{
//获取要操作的类
Class clazz=Class.forName(classUrl);
//用来存放要调用的参数类型(int,string,......)
Class[] param=null;
//用于存放传参的数据数组
Object[] paramObj=new Object[args.size()];
//如果传递了参数
if(args.size()>0){
if(args.size()==1){
param=new Class[args.size()];
}else{
param=new Class[args.size()-1];
}
//遍历参数集合
for (int i = 0; i < param.length; i++) {
//获取每个类参数的所属的类型
param[i]=args.get(i).getClass();
System.out.println(args.get(i).getClass());
//list转数组
paramObj[i]=args.get(i);
}
Method method=clazz.getMethod(function, param);
//反射传入数据
Object obj=method.invoke(clazz.newInstance(),paramObj);
return obj;
}
return null;
}
//调用............
public static void main(String[] args) throws Exception {
List arg=new ArrayList();
arg.add("我要置业小上海");
String str= (String)commonReflectMethod("com.reflex.House","getNum",arg);
System.out.println(str);
非常重要的说明:
我们在获取参数的类型时(对应的上图代码:args.get(i).getClass();) 请注意!! 如果参数是基本类型比如:
int ,long ,short,byte,double ,float等,则会出现问题。因为这些类型通过getClass方法后会变成包装类,所以通常我在使用的时候都会把基本类型参数String.valueOf()