/**
* 用javassist分析方法名,并最终用java的反射调用
* @throws Exception
*
*/
@Test
public void invoke() throws Exception{
//声明javassist类对象
ClassPool pool = ClassPool.getDefault();
//创建被调用类
Object one = new One();
//声明javassist方法解析类
CtMethod cm= null;
try{
//处理此方法是否存在
cm = pool.getMethod(one.getClass().getName(), "abc");
}catch(Exception e){
throw new RuntimeException("此方法不存在");
}
//判断是否为公开的类型
if(cm!=null && Modifier.isPublic(cm.getModifiers())){
//声明放Class的集合,还可以有其他方法
List<Class<?>> list = new ArrayList<Class<?>>();
System.err.println("方法为:"+cm);
//获取所有参数类型
CtClass[] cs = cm.getParameterTypes();
//遍历所有参数类型
for(CtClass cc : cs){
//要对每一种参数类型进行判断,以下只判断了int的基本类型,还有很多需要判断
//TODO:判断所有数据类型
if(cc.isPrimitive() && cc.getName().equals("int")){
list.add(int.class);
}else{//如果是对象类型,也同样需要判断,//TODO:所有的String,Boolean,Integer都要判断,以下
list.add(Class.forName(cc.getName()));
}
}
//以下用于动态反射方法
Class<?>[] css = new Class<?>[list.size()];
//封装被传递的对象
Object[] o = new Object[list.size()];
for(int i=0;i<list.size();i++){
css[i] = list.get(i);
if(css[i].isPrimitive()){//TODO:这儿我只判断了int类型,还有许多需要判断
o[i] = 90;
}else{//以下是对象类型,//TODO:还有很多需要判断
o[i] = "String";
}
}
//最终反射出方法,只会调用第一个找到的方法,如果有重载
Method m = one.getClass().getMethod("abc",css);
//最终完成调用
m.invoke(one,o);
}
}
被调用的类:
以下只会被调用abc(String name,int age)方法,被重载的方法不会被调用:
package cn.test;
public class One{
public void abc(String name,int age){
System.err.println("name: is:"+name+",age:"+age);
}
public void abc(String name,int age,int aaa){
System.err.println("name: is:"+name+",age:"+age+",,"+aaa);
}
}