1、在反射机制中,把类中的成员(构造方法、成员方法、成员变量)都封装成了对应的类进行表示。其中,构造方法使用类Constructor表示。可通过Class类中提供的方法获取构造方法:
(1)返回一个构造方法
public Constructor<T> getConstructor(Class<?>... parameterTypes) 获取public修饰, 指定参数类型所对应的构造方法
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 获取指定参数类型所对应的构造方法(包含私有的)
(2)返回多个构造方法
public Constructor<?>[] getConstructors() 获取所有的public 修饰的构造方法
public Constructor<?>[] getDeclaredConstructors() 获取所有的构造方法(包含私有的)
(3)获取构造方法的代码演示
1 package cn.gzdlh_01_Reflect;
2
3 import java.lang.reflect.Constructor;
4
5 public class ReflectDemo {
6 public static void main(String[] args) throws ClassNotFoundException,
7 NoSuchMethodException, SecurityException {
8 // 获取Class对象
9 Class c = Class.forName("cn.gzdlh_01_Reflect.Person");// 包名.类名
10
11 // 获取所有的构造方法
12 // Constructor[] cons = c.getConstructors();
13 Constructor[] cons = c.getDeclaredConstructors();
14 for (Constructor con : cons) {
15 System.out.println(con);
16 }
17
18 System.out.println("------------------------");
19 // 获取一个构造方法
20 // public Person()
21 Constructor con1 = c.getConstructor(null);
22 System.out.println(con1);
23
24 // public Person(String name)
25 Constructor con2 = c.getConstructor(String.class);
26 System.out.println(con2);
27
28 // private Person(String name, int age)
29 Constructor con3 = c.getDeclaredConstructor(String.class, int.class);
30 System.out.println(con3);
31
32 // public Person(String name, int age, String address)
33 Constructor con4 = c.getDeclaredConstructor(String.class, int.class,
34 String.class);
35 System.out.println(con4);
36 }
37 }
2、通过反射方式,获取构造方法,创建对象
(1)获取构造方法,步骤如下:
①获取到Class对象;
② 获取指定的构造方法;
③通过构造方法类Constructor中的方法,创建对象。
public T newInstance(Object... initargs)
(2)代码演示
1 package cn.gzdlh_01_Reflect;
2
3 import java.lang.reflect.Constructor;
4 import java.lang.reflect.InvocationTargetException;
5
6 public class ConstructorDemo {
7 public static void main(String[] args) throws ClassNotFoundException,
8 NoSuchMethodException, SecurityException, InstantiationException,
9 IllegalAccessException, IllegalArgumentException,
10 InvocationTargetException {
11 // 1,获取到Class对象
12 Class c = Class.forName("cn.gzdlh_01_Reflect.Person");// 包名.类名
13 // 2,获取指定的构造方法
14 // public Person()
15 // Constructor con = c.getConstructor(null);
16
17 // public Person(String name, int age, String address)
18 Constructor con = c.getConstructor(String.class, int.class,
19 String.class);
20
21 // 3,通过构造方法类中Constructor的方法,创建对象
22 // Object obj = con.newInstance(null);
23 Object obj = con.newInstance("gzdlh", 23, "广州");
24
25 // 显示
26 System.out.println(obj);
27 }
28 }
3、通过反射方式,获取私有构造方法,创建对象
(1)AccessibleObject 类是 Field、Method 和 Constructor 对象的父类。它提供了将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力;
(2)对于公共成员、默认(打包)访问成员、受保护成员和私有成员,在分别使用 Field、Method 或 Constructor 对象来设置或获取字段、调用方法,或者创建和初始化类的新实例的时候,会执行访问检查;
(3)常用方法
public void setAccessible(boolean flag) throws SecurityException 参数值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。参数值为 false 则指示反射的对象应该实施 Java 语言访问检查
(4)获取私有构造方法,步骤如下:
①获取到Class对象;
②获取指定的构造方法;
③暴力访问, 通过setAccessible(boolean flag)方法;
④通过构造方法类Constructor中的方法,创建对象
public T newInstance(Object... initargs)
(5)代码演示
1 package cn.gzdlh_01_Reflect;
2
3 import java.lang.reflect.Constructor;
4 import java.lang.reflect.InvocationTargetException;
5
6 public class ConstructorDemo2 {
7 public static void main(String[] args) throws ClassNotFoundException,
8 NoSuchMethodException, SecurityException, InstantiationException,
9 IllegalAccessException, IllegalArgumentException,
10 InvocationTargetException {
11 // 1,获取到Class对象
12 Class c = Class.forName("cn.gzdlh_01_Reflect.Person");// 包名.类名
13
14 // 2,获取指定的构造方法
15 // private Person(String name, int age)
16 Constructor con = c.getDeclaredConstructor(String.class, int.class);
17
18 // 3,暴力反射
19 con.setAccessible(true);// 取消 Java 语言访问检查
20
21 // 4,通过构造方法类中的功能,创建对象
22 Object obj = con.newInstance("gzdlh", 23);
23 System.out.println(obj);
24
25 }
26 }