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 }