黑马程序员技术交流社区

标题: 反射之getConstructors() [打印本页]

作者: 左拉    时间: 2014-4-17 23:41
标题: 反射之getConstructors()
本帖最后由 左拉 于 2014-4-18 15:32 编辑

反射机制里面取得全部构造方法用getConstructors()方法返回构造方法的数组,现在要想通过下标取得对应的构造方法并通过参数进行实例化,如何确定下标呢?是按照定义构造方法的时候出现的顺序吗?
假设有个Person类

  1. class Person
  2. {
  3.        private String name;
  4.        private int age;
  5.        public Person(){}
  6.        public Person(String name)
  7.        {
  8.              this.name=name;
  9.        }
  10.        public Person(int age)
  11.        {
  12.             this.age=age;
  13.       }
  14.       public Person(String name,int age)
  15.       {
  16.           this.name=name;
  17.           this.age=age;
  18.       }
  19. public class Test{
  20.       public static void main(String[] args)throws Exception{
  21.                  Class<?> c=Class.forName("Person");
  22.                  Constructor[] cons=c.getConstructors();
  23.                 /*
  24.                   for(int i=0;i<cons.length;i++)
  25.                  {
  26.                       System.out.println(cons.getName());
  27.                   }
  28.                */
  29.                  Person per=(Person)cons[ 这个下标是多少 ].newInstance("testa",20);
  30.         }

  31. }
复制代码
手工敲代码不易!求雷锋啊




作者: 清风有意    时间: 2014-4-17 23:55
经过验证,构造方法的下标是根据在Person类中定义的构造方法的逆序而排序的。
从你的代码中,应该可以看出,是角标0;

  1. package ClassTest;

  2. import java.lang.reflect.Constructor;

  3. public class ConstructorTest {

  4.         public static void main(String[] args) {
  5.                 Person p=new Person();
  6.                 Constructor[] clazzConstructors=p.getClass().getConstructors();
  7.                 for(int x=0;x<clazzConstructors.length;x++)
  8.                 {
  9.                         System.out.println(clazzConstructors[x]);
  10.                 }
  11.                

  12.         }

  13. }
  14. class Person{
  15.        
  16.        
  17.        
  18.         public Person(int x){}
  19.        
  20.         public Person(){}
  21.        
  22.         public Person(int x,int y){}
  23.        
  24.         public Person(int x,String y){}
  25.        
  26.        
  27. }
复制代码


打印的是
  1. public ClassTest.Person(int,java.lang.String)
  2. public ClassTest.Person(int,int)
  3. public ClassTest.Person()
  4. public ClassTest.Person(int)
复制代码

作者: 左拉    时间: 2014-4-18 00:00
逆序的 ,好奇怪,谢谢你,我现在没有开发环境,所以自己验证不了= =。
作者: 随风而去    时间: 2014-4-18 00:24
//想直接获得下标是不可能的,但是可以通过获取形参类型数组做出具体的判断 代码如下  person类
static void cons(String name,int age,char sex) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
                //获得构造器数组
                Constructor[] cos = Person.class.getConstructors();
                List<Person> ls = new ArrayList<>();
                Person p = null;  //我的自定义Person 有3个属性 String name , int age, char sex 3个构造方法 无参 全参  一个参数
                for(Constructor c : cos){ //foreach 循环
                        Class[] classes =  c.getParameterTypes();
                        //这个地方你甚至可用class反射属性 而搞出相应的值 你可以在方法添加形参 这样子就可以动态设置数据了
                        if(classes.length==3){
                                p = (Person) c.newInstance(name,age,sex);
                        }else if(classes.length==1){
                                //如果是Stirng类型的
                                if(classes[0]==String.class){
                                        p = (Person) c.newInstance(name);
                                }
                        }else{
                                p = (Person) c.newInstance();
                        }
                        ls.add(p);
                }
                for(Person ps :ls ){
                        System.out.println(ps);
                }
        }

作者: 左拉    时间: 2014-4-18 00:36
随风而去 发表于 2014-4-18 00:24
//想直接获得下标是不可能的,但是可以通过获取形参类型数组做出具体的判断 代码如下  person类
static vo ...


我也觉得直接获得下标不可能,因为要使用反射的时候就是由于不知道类中的具体信息。你的代码对我很有启发,不过有个东西漏了。。。 List<Person> ls = new ArrayList<Person>();手工敲的吗?

作者: 随风而去    时间: 2014-4-18 00:41
左拉 发表于 2014-4-18 00:36
我也觉得直接获得下标不可能,因为要使用反射的时候就是由于不知道类中的具体信息。你的代码对我很有启发 ...

额....没注意  可能敲快了   呵呵 终于碰到一个我回答问题有互动的了,我其余地方回复的都木有人给我互动
谢谢你让我知道我的回答对你有用
作者: 左拉    时间: 2014-4-18 00:45
左拉 发表于 2014-4-18 00:36
我也觉得直接获得下标不可能,因为要使用反射的时候就是由于不知道类中的具体信息。你的代码对我很有启发 ...

码农都是这样,一切尽在不言中,缺少沟通。习惯就好:)
作者: igi9009    时间: 2014-4-18 00:57
随风而去 发表于 2014-4-18 00:24
//想直接获得下标是不可能的,但是可以通过获取形参类型数组做出具体的判断 代码如下  person类
static vo ...

很有启发,受教了
作者: 左拉    时间: 2014-4-18 01:00
igi9009 发表于 2014-4-18 00:57
很有启发,受教了

你看看,识货的人还是很多的;P
作者: 随风而去    时间: 2014-4-22 09:22
左拉 发表于 2014-4-18 00:45
码农都是这样,一切尽在不言中,缺少沟通。习惯就好

List<Person> ls = new ArrayList<Person>(); 这个是 JDK1.7的新特性之一




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2