反射机制 - Constructor类
1. 基本概念
java.lang.reflect.Constructor类:主要用于描述获取到的构造方法信息
2. Class类中,与Constructor类有关的常用方法
Constructor getConstructor(Class<?>... parameterTypes) | 用于获取此Class对象所表示类型中,参数指定的公共构造方法 |
Constructor<?>[] getConstructors() | 用于获取此Class对象所表示类型中,所有的公共构造方法 |
3. Constructor类的常用方法
T newInstance(Object... initargs ) | 使用此Constructor对象描述的构造方法,来构造Class对象代表类型的新实例 |
int getModifiers() | 获取方法的访问修饰符 |
String getName() | 获取方法的名称 |
Class<?>[] getParameterTypes() | 获取方法所有参数的类型 |
4. 代码示例
1 // (假设已存在一个 Person.java 类 ) 2 3 class PersonConstructorTest { 4 5 main() throws Exception { 6 7 8 9 // 1. 使用原始方式,以无参形式,构造Person类型的对象,并打印 10 11 Person p1 = new Person(); 12 13 print(“无参方式创建的对象是:” + p1); // null 0 14 15 16 17 // 2. 使用反射机制,以无参形式,构造Person类型的对象,并打印 18 19 // 创建对象的类型,可以从键盘输入 20 21 // print("请输入要创建对象的类型:"); 22 23 // Scanner sc = new Scanner (System.in); 24 25 // String str1 = sc.next(); 26 27 // Class c1 = Class.forName("com.lagou.task20.Person"); 28 29 30 31 // 创建对象的类型,可以从配置文件中读取 32 33 BufferedReader br = new BufferedReader (new InputStreamReader(new FileInputStream("d:/a.txt "))); 34 35 String str1 = br.readLine(); 36 37 Class c1 = Class.forName(str1); 38 39 // print("无参方式创建的对象是:" + c1.newInstance() ); // null 0 40 41 // 获取Class对象对应类中的无参构造方法,也就是Person类中的无参构造方法 42 43 Constructor constructor = c1.getConstructor(); 44 45 // 使用获取到的无参构造方法,来构造对应类型的对象,也就是Person类型的对象 46 47 print("无参方式创建的对象是:" + constructor.newInstance() ); 48 49 // sc.close(); 50 51 br.close(); 52 53 54 55 // 3.使用原始方式,以有参方式,构造Person类型的对象,并打印 56 57 Person p2 = new Person("zhangfei",30); 58 59 print("有参方式构造的对象是:" + p2); // zhangfei 30 60 61 62 63 // 4.使用反射机制,以有参方式,构造Person类型的对象,并打印 64 65 // 获取Class对象对应类中的有参构造方法,也就是Person类中的有参构造方法 66 67 Constructor constructor1 = c1.getConstructor(String.class, int.class); 68 69 // 使用获取到的有参构造方法,来构造对应类型的对象,也就是Person类型的对象 70 71 // newInstance方法中的实参,是用于给有参构造方法的形参进行初始化的,也就是给name和age进行初始化的 72 73 print("有参构造的对象是:" + constructor1.newInstance("zhangfei",30)); // zhangfei 30 74 75 76 77 // 5. 使用反射机制,获取Person类中,所有的公共构造方法,并打印 78 79 Constructor[] constructors = c1.getConstructors(); 80 81 for (Constructor ct: constructors) { 82 83 print("构造方法的访问修饰符是" + ct.getModifiers() ); 84 85 print("构造方法的方法名称是" + ct.getName() ); 86 87 Class[] parameterTypes = ct.getParameterTypes(); 88 89 print("构造方法的所有参数类型是:"); 90 91 for (Class cs : parameterTypes) { 92 93 print(cs + " "); 94 95 } 96 97 println(); 98 99 } 100 101 } 102 103 }
<1> 无参方式,构造对象
<2> 有参方式,构造对象
<3> 使用getConstructors(), 得到类中的所有构造方法
1 // 5.使用反射机制获取Person类中所有的公共构造方法并打印 2 Constructor[] constructors = c1.getConstructors(); 3 for (Constructor ct : constructors) { 4 System.out.println("构造方法的访问修饰符是:" + ct.getModifiers()); 5 System.out.println("构造方法的方法名称是:" + ct.getName()); 6 Class[] parameterTypes = ct.getParameterTypes(); 7 System.out.print("构造方法的所有参数类型是:"); 8 for (Class cs : parameterTypes) { 9 System.out.print(cs + " "); 10 } 11 System.out.println(); 12 System.out.println("-------------------------------------------------");