A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

          看了张老师的利用反射求参数类型的视频,但是发觉一个问题,要是方法接收的参数不一样,比如Method(Vector<string>,int x,),这里面接收了两个参数,一个是Vector集合,集合里面的元素是string型的,一个是x,x是int的,如何利用程序把他们都找出来?(张老师的只是接收一个参数Vector<Date>,没有后面的int x,)本人最想知道的是判断条件。自己也写了一个代码,但不能找到int ,会报错
package Parameter;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Vector;
/*需求:获取某个参数的参数类型(比如参赛类型是Int还是string的)
* 步骤:
* 1、由于没法直接获得参数的参数类型,可以创建一个接受参数的方法,
* 2、利用方法的反射可以获得方法参数列表
* 3、利用参数类对参数进行操作可以获得参数类型
* */
public class FindParameter
{      
            //定义一个接受参数的方法,假如我们要获得 v1,和x的参数类型
            public static void apply(Vector<String> v1,ArrayList<String> x , int y)
           {
  
            }
             public static void main(String[] args)throws Exception
            {
                         //对方法进行反射,获取类在内存中的字节码
                        Class<FindParameter> findClass= FindParameter.class;
                       //获取类中的方法
                         Method applMethod = findClass.getMethod("apply",Vector.class,ArrayList.class,int.class);
                        //获取参数类型,由于函数里不只一种参数类型,所以需要数组形式来接收
                       Type[] genType = applMethod.getGenericParameterTypes();
                         //判断方法中接收了几个参数(假如参数是用配置文件读取来的时候)
                        int len = genType.length;
                         System.out.println("此方法接收了"+len+"个参数");
                        //对获得的参数类型进行迭代,
                        int i = 1;//用于表参数的位置
                      for(Type gt:genType)
                     {
                                /*把获得的参数类型转换成参数化类型,好利用参数类化类型的方法对其进行参照,比如取出原始参数
                               类型,实际参数类型等*/
                               System.out.println("第"+i+"个参数");
                               ParameterizedType pType = (ParameterizedType)gt;  
                               //获得原始参数类型
                               Type rawtype= pType.getRawType();
                               //打印出原始参数类型
                               System.out.println("原始参数类型是:"+rawtype);
                              //获取实际参数类型
                              Type actualtype = pType.getActualTypeArguments()[0];
                                //打印实际参数类型
                              System.out.println("实际参数类型是:"+actualtype);
                                i++;
                      }
            }

}

打印结果:
此方法接收了3个参数
第1个参数
原始参数类型是:Vector(前缀省略了,没写)
实际参数类型是:String
第2个参数
原始参数类型是:ArrayList
实际参数类型是:String
第3个参数
接下来是报错了,没把int打印出来,想知道这么样去设置判断条件,让他们都打印出来  tks

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

1 个回复

倒序浏览
package Parameter;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.util.ArrayList;
import java.util.Vector;
/*需求:获取某个参数的参数类型(比如参赛类型是Int还是string的)
* 步骤:
* 1、由于没法直接获得参数的参数类型,可以创建一个接受参数的方法,
* 2、利用方法的反射可以获得方法参数列表
* 3、利用参数类对参数进行操作可以获得参数类型
* */
public class FindParameter
{      
            //定义一个接受参数的方法,假如我们要获得 v1,和x的参数类型
            public static void apply(Vector<String> v1,ArrayList<String> x , int y)
           {
  
            }
             public static void main(String[] args)throws Exception
            {
                         //对方法进行反射,获取类在内存中的字节码
                        Class<FindParameter> findClass= FindParameter.class;
                       //获取类中的方法
                         Method applMethod = findClass.getMethod("apply",Vector.class,ArrayList.class,int.class);
                        //获取参数类型,由于函数里不只一种参数类型,所以需要数组形式来接收
                       Type[] genType = applMethod.getGenericParameterTypes();
                         //判断方法中接收了几个参数(假如参数是用配置文件读取来的时候)
                        int len = genType.length;
                         System.out.println("此方法接收了"+len+"个参数");
                        //对获得的参数类型进行迭代,
                        int i = 1;//用于表参数的位置
                      for(Type gt:genType)
                     {
                                /*把获得的参数类型转换成参数化类型,好利用参数类化类型的方法对其进行参照,比如取出原始参数
                               类型,实际参数类型等*/
                               System.out.println("第"+i+"个参数");
                               if(gt instanceof ParameterizedType)
                               {
                               ParameterizedType pType = (ParameterizedType)gt;  
                               //获得原始参数类型
                               Type rawtype= pType.getRawType();
                               //打印出原始参数类型
                               System.out.println("原始参数类型是:"+rawtype);
                              //获取实际参数类型
                              Type actualtype = pType.getActualTypeArguments()[0];
                                //打印实际参数类型
                              System.out.println("实际参数类型是:"+actualtype);
                               }
                               else
                               {
                                       System.out.println(gt);
                                      
                               }

                                i++;
                      }
            }

}

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马