【反射之构造器(constructor)】

■如何获取到.class文件字节码对象:

  使用Class类的静态方法forName()方法,其参数:类名前(Person)必须加上包名(reflect)

 Class<?> personClass = Class.forName("reflect.Person");

■获取字节码对象的构造器分为两种:

  第一种:获取所有的构造器,只能获取公有的构造器,而不能获取到私有的构造器

Constructor<?>[] constructors = personClass.getConstructors();

  第二种:获取字节码的指定构造器,其参数为:传入构造器的参数类型加上“.class”

Constructor<?> constructor = personClass.getConstructor(String.class, int.class);

■如何使用构造器创建对象:

  使用构造器调用newInstance(),传入相应的参数。

 

Object p = constructor.newInstance("周娟娟", 23);

 

代码:

 1 package reflect_constructor;
 2 
 3 import java.lang.reflect.Constructor;
 4 import java.lang.reflect.InvocationTargetException;
 5 
 6 import reflect.Person;
 7 
 8 public class ConstructorDemo {
 9 
10     public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
11         // 使用Class获取.class文件字节码对象。类名前(Person)必须加上包名(reflect)。
12         Class<?> personClass = Class.forName("reflect.Person");
13         
14         // 获取对象的所有构造器(只能获取到公有的,不能获取到私有构造器)
15         Constructor<?>[] constructors = personClass.getConstructors();
16         for (Constructor<?> constructor : constructors) {
17             System.out.println(constructor);
18         }
19         
20         // 使用字节码对象获取指定构造器
21         Constructor<?> constructor = personClass.getConstructor(String.class, int.class);
22         System.out.println(constructor);
23         
24         // 使用构造器创建实例对象
25         Object p = constructor.newInstance("周娟娟", 23);
26         System.out.println(p);
27     }
28 
29 }

 

 1 package reflect;
 2 
 3 public class Person {
 4     
 5     private String name;
 6     private int age;
 7     
 8     public Person() {
 9     }
10     
11     private Person(int age) {
12         
13     }
14     
15     public Person(String name, int age) {
16         super();
17         this.name = name;
18         this.age = age;
19     }
20 
21     public String getName() {
22         return name;
23     }
24 
25     public void setName(String name) {
26         this.name = name;
27     }
28 
29     public int getAge() {
30         return age;
31     }
32 
33     public void setAge(int age) {
34         this.age = age;
35     }
36 
37     @Override
38     public String toString() {
39         return "Person [name=" + name + ", age=" + age + "]";
40     }
41 
42 }

 

posted @ 2017-07-21 19:41  JaneBaby  阅读(524)  评论(0编辑  收藏  举报