【反射之构造器(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 }