用Javassist分析方法及参数,并通过java反射去调用

用Javassist分析方法及参数,并通过java反射去调用

http://www.gwdang.com

http://www.gwdang.com/app/extension 

/**

 * 用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);

}

}

你可能感兴趣的:(并通过java反射去调用)