近期在看java的反射,产生一些疑问,想询问下。通过反射,拿到一个字节码文件的所有public类型的方法,然后调用方法,如果是有参数的方法,怎么去构造函数所对应的类型参数?并传递参数调用函数?如: public void add(String str,int x){
   System.out.println(str+x);
}上面的函数,通过反射获Method对象后,怎么通过其参数类型,传递参数并调用啊?(假设调用者不知道这个函数的参数类型),完全通过反射得到参数类型,然后根据参数类型去构造实参调用。 Java

解决方案 »

  1.   

    如果参数时基本类型,你就自己手工构造(比如int,boolean这些),如果不是基本类型,就通过Class的forName方法先加载该类,然后再newInstance
      

  2.   


    public class T {

    public void fun(String s){
    }

    public void fun1(String s ,int i){

    } public static void main(String[] args) throws Exception {
    Class c = Class.forName("cn.com.reflect.T");
    Method[] ms = c.getDeclaredMethods();
    for(int i = 0;i < ms.length;i++){
    Method m = ms[i];
    Class[] params = m.getParameterTypes();
    System.out.println(m.getName() + "方法的参数类型是:");
    for(int j = 0;j < params.length;j++){
    System.out.println(params[j].getName());
    }
    System.out.println();
    }
             }
    }
    参考下吧.
      

  3.   

    以上就可得到参数类型
    调用的话Method.revoke就可以了.
      

  4.   

    可以参考下以下代码:
    package szw.junit;import java.lang.reflect.Method;import junit.framework.Assert;
    import junit.framework.TestCase;public class TestCalculator2 extends TestCase
    {
    public void testAdd()
    {
    try
    {
    Calculator2 cal2 = new Calculator2();

    Class<Calculator2> clazz = Calculator2.class; Method method = clazz.getDeclaredMethod("add", new Class[] {
    Integer.TYPE, Integer.TYPE }); method.setAccessible(true); Object result = method.invoke(cal2, new Object[] { 2, 3 }); Assert.assertEquals(5, result); }
    catch (Exception ex)
    {
    Assert.fail();
    } }
    }
      

  5.   

    反射主要在try语句块中实现,其中获取的是类Calculator2中的私有方法add(int a, int b),另外使用invoke来调用对象cal2中的add()方法,传递的实参值是2,3,即"method.invoke(cal2, new Object[] { 2, 3 })"相当于"cal2.add(2, 3)"