Class cls = Class.forName("Method2");//获取Method2类的相关接口和类的信息,返回成Class实例
           
           Method[] method = cls.getDeclaredMethods();//获取Method2类的方法,返回成Method数组
           
           for(int i=0; i<method.length; i++){//遍历Method数组
            Method m = method[i];
            
            Class<?>[] mParaType = m.getParameterTypes();//取得每个方法的参数类型
大家看到上面的代码,结合我的注释应该能明白怎么回事。我的问题是最后一句代码,Class<?>的数组,当我们取得参数类型的时候,这个Class的泛型是不是能够确定下来(我觉得能)?如果能,怎么确定?如果不能的话,我们又怎么根据需求和反射来动态选择执行函数呢?
不知道大家明白我的意思没?下面这段代码是原始代码,我觉得没有什么意义啊,请看注释...我觉得都知道了参数是Integer了,还要反射干嘛?我觉得这不是真正的动态执行啊...
import java.lang.reflect.*; public class method2 { 
   public int add(int a, int b) { 
      return a + b; 
   }    public static void main(String args[]) { 
      try { 
           Class cls = Class.forName("method2");            Class partypes[] = new Class[2]; 
           partypes[0] = Integer.TYPE; //都知道了是Integer了  还反射啥啊...
           partypes[1] = Integer.TYPE; 
       
           Method meth = cls.getMethod("add", partypes);            method2 methobj = new method2(); 
           Object arglist[] = new Object[2]; 
           arglist[0] = new Integer(37); 
           arglist[1] = new Integer(47);            Object retobj = meth.invoke(methobj, arglist); 
           Integer retval = (Integer) retobj; 
           System.out.println(retval.intValue()); 
      } catch (Throwable e) { 
           System.err.println(e); 
      } 
   } 
}  

解决方案 »

  1.   

    Method有方法getParameterTypes()的.这样写的比较多:假设你已经获得了一个Class对象叫clsMethod[] methods = cls.getDeclaredMethods();
    for(int i=0;i<methods.length;i++){
        Class returnType = methods[i].getReturnType();
        Class[] paramTypes = methods[i].getParameterTypes();
        // process(methods[i]);}
      

  2.   

    可以啊。每个参数是个Class,可以调用他的getName能知道他的类型了。举个例子package com.mayuanfei.test;public class test {
    public void xixi (IProject project) {
    project.haha();
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
    char c = '\u0020';
    System.out.println("hahaha-->"+c+"<---hahaha");
    }}测试的类package com.mayuanfei.test;import java.lang.reflect.Method;public class FansheTest { /**
     * @param args
     */
    public static void main(String[] args) {
    try {
    Class<?> testClass = Class.forName("com.mayuanfei.test.test");
    Method[] methods = testClass.getDeclaredMethods();
    for(Method m : methods) {
    Class<?>[] types = m.getParameterTypes();
    for(Class c : types) {
    System.out.println(c.isArray());
    System.out.println(c.getName());
    }
    }
    } catch (ClassNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }}输出的结果 :
    false
    com.mayuanfei.test.IProject
    true
    [Ljava.lang.String;
      

  3.   

    回5# 我知道如何打印出变量的类型 但是我是想通过反射得出参数列表的类型,再由这个类型去定义变量。而不是像我帖子里第二段代码那样直接去定义成Integer(好像我之前就知道一样),不知道你明白我的意思没  呵呵
      

  4.   

    我还没遇到过这种需求,getParameterTypes方法也没用到现在一般都是框架里,解析xml并由此执行java的时候用反射,不过框架已经内部封装好了还有就是很多类有相同的方法,但是没有统一interface,用反射处理还可以,特别是不同类相同属性的clone,不过也有封装好的包
      

  5.   


    就是说我这样的需求 其实是没有必要的  对吧?那比如像Eclipse这样的  敲一个Symstem 然后打个点 马上就会出来所有方法的列表  我觉得这个是不是就是利用反射做的  
      

  6.   

    应该是吧,导入的都是class文件.
      

  7.   

    可不可以通过分析class文件得到一些结论?
      

  8.   

    Big penguin! Are u online? Please answer my question on 15#, thanks...
      

  9.   

    建议你分析一下。
    不过class文件中泛型中的类型信息已经擦除了。不知道能不能看出什么东西。
    我不怎么了解泛型。
      

  10.   

    partypes[0] = Integer.TYPE; //都知道了是Integer了  还反射啥啊...
    partypes[1] = Integer.TYPE; 
           
    Method meth = cls.getMethod("add", partypes); ————————————————————————————————这个问题跟反射无关吧,这样只是在类中一堆方法中定位一个方法,确定了方法名和
    方法参数类型就能精确地定位一个方法。
      

  11.   

    不会有风险啊,getMethod 会抛出三个异常,这些异常不是运行期异常,必须显式地进行捕获的。
    如果找不到满足条件的方法,会抛出 NoSuchMethodException 这个异常。
      

  12.   

    反射就是通过代码来查看类的信息。我认为反射最大的好处就是可以通过字符串格式的类名来产生类的实例,
    通过方法名的字符串形式进行方法调用。如果没有反射通过字符串根本没办法获得类的实例,ORM、IoC 等框架都
    不会出现了,因为这些框架都是依靠配置在 XML 文件中的字符串信息通
    过反射来进行处理的。
      

  13.   


    引用中对应为代码  其实就是我在帖子中的
    Method meth = cls.getMethod("add", partypes); 
    对吧?