1、遇到问题,int等基础数据类型,获取参数类型的时候获取到的是Integer等非基础数据类型,导致报错!!
如代码2中所示,可能函数存在int类型的参数也可能存在Integer参数,所以也不能简单的把Integer的转换成int.class。(其实很少有用到Integer作为参数的吧)
代码如下:
package demo.reflect.b;
/**
* 试试反射的常用功能
* @author zmy
*
*/
public class ReflectionDemo {
/**
* 试试参数传递怎么用
* @param p
* @return
*/
//调用这个参数类型的时候参数类型应该是int.class
public String UpString(String p,int num)
{
return p.toUpperCase()+num;
}
//调用这个的时候参数类型是Integer
public String UpString(String p,Integer num)
{
return p.toUpperCase()+ num;
}
}
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class TestReflection { /**
* @param args
* @throws InstantiationException
* @throws InvocationTargetException
* @throws IllegalAccessException
* @throws NoSuchMethodException
* @throws ClassNotFoundException
* @throws IllegalArgumentException
* @throws SecurityException
*/
public static void main(String[] args) throws SecurityException, IllegalArgumentException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
// TODO Auto-generated method stub
Object [] myArgs = {"sdf",123};
test("demo.reflect.b.ReflectionDemo","UpString",myArgs);
}
public static void test(String ClassName,String methName,Object[] args) throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException
{
Class demoClass = Class.forName(ClassName);
Class [] paraTypes = new Class[args.length];
for(int i =0; i < args.length; i++)
{
//基础数据类型的时候会存在问题,报错说函数未定义。int的其实应该传入int.class而不是Integer。
paraTypes[i] = args[i].getClass();
System.out.println("paraTypes["+i+"]:" + paraTypes[i]);
//这里把int.class作为参数类型是不会存在问题的。
//args[1].getClass 获取的为Integer.class,是会调用重载的使用Integer作为参数的函数的。
if(paraTypes[i].equals(Integer.class))
{
paraTypes[i] = int.class;
System.out.println("paraTypes["+i+"]change to Type:" + paraTypes[i]);
}
}
Method method = demoClass.getMethod("UpString", paraTypes);
System.out.println(method.invoke(demoClass.newInstance(), args));
}
}
运行结果如下:
paraTypes[0]:class java.lang.String
paraTypes[1]:class java.lang.Integer
paraTypes[1]change to Type:int
SDF123