java 反射 动态调用函数

来源:互联网 发布:汽车用品大全淘宝网 编辑:程序博客网 时间:2024/05/29 11:42
预计实现的目的是传入对象名称,函数名称,函数参数数组。实现动态调用函数并返回。

1、遇到问题,int等基础数据类型,获取参数类型的时候获取到的是Integer等非基础数据类型,导致报错!!

如代码2中所示,可能函数存在int类型的参数也可能存在Integer参数,所以也不能简单的把Integer的转换成int.class。(其实很少有用到Integer作为参数的吧)

代码如下:

 

package demo.reflect.b;/** * 试试反射的常用功能 * @author zmy * */public class ReflectionDemo {/** * 试试参数传递怎么用 * @param p * @return *///调用这个参数类型的时候参数类型应该是int.classpublic String UpString(String p,int num){return p.toUpperCase()+num;}//调用这个的时候参数类型是Integerpublic 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.StringparaTypes[1]:class java.lang.IntegerparaTypes[1]change to Type:intSDF123


 

 

 

原创粉丝点击