关于Java中泛型、反射和注解的扫盲篇 (2)

在我们上面自定义的ReflectTarget类中创建各种类型的构造函数,用于测试 // --------构造函数-------- // 访问修饰符为默认的构造函数,即同包可访问得 ReflectTarget(String str) { System.out.println("(默认)的构造方法 s= " + str); } //无参构造函数 public ReflectTarget() { System.out.println("调用了公有的无参构造函数。。。"); } //有一个参数的构造函数 public ReflectTarget(char name) { System.out.println("调用了带有一个参数构造函数,参数为:" + name); } //有多个参数的构造函数 public ReflectTarget(String name,int index) { System.out.println("调用了有多个参数构造函数,参数值为【目标名】:" + name + "【序号】" + index); } //受保护的构造函数 protected ReflectTarget(boolean b) { System.out.println("受保护的构造方法:" + b); } //私有的构造函数 private ReflectTarget(int index){ System.out.println("私有的构造方法,序号:" + index); }

新创建一个类ConstructorCollector测试通过反射获取目标反射类的所有构造方法 package demo.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; /** * 获取构造方法: * 1)批量构造方法 * public Constructor[] getConstructors() 获取所有”公有的“构造方法 * public Constructor[] getDeclaredConstructors() 获取所有的构造方法(包括私有的、受保护的、默认和公有的) * 2)获取单个的方法,并调用 * public Constructor getConstructor(Class...parameterTypes) 获取单个的”公有的“构造方法 * public Constructor getDeclaredConstructor(Class...parameterTypes) 获取某个构造方法(可以是私有的、受保护的、默认和公有的) * * 调用构造方法: Constructor --> newInstance(Object...intArgs) */ public class ConstructorCollector { public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { Class clazz = Class.forName("demo.reflect.ReflectTarget"); // 获取所有的公有构造方法 System.out.println("**************所有公有的构造方法**************"); Constructor[] conArray = clazz.getConstructors(); for (Constructor con : conArray) { System.out.println(con); } // 获取所有的构造方法 System.out.println("**************所有的构造方法(包括私有的、受保护的、默认和公有的)**************"); conArray = clazz.getDeclaredConstructors(); for (Constructor con : conArray) { System.out.println(con); } //或获取单个带参数的公有构造方法 System.out.println("**************获取公有、带两个参数的构造方法**************"); Constructor con = clazz.getConstructor(String.class,int.class); System.out.println("con = " + con); // 获取单个私有的构造方法 System.out.println("**************获取单个私有的构造方法**************"); con = clazz.getDeclaredConstructor(int.class); System.out.println("con = " + con); System.out.println("##################################################"); System.out.println("**************通过私有构造方法创建实例**************"); con.setAccessible(true); // 设置暴力访问,忽略掉访问修饰符 ReflectTarget reflectTarget = (ReflectTarget) con.newInstance(1); } } /*** * 运行结果如下: * **************所有公有的构造方法************** * public demo.reflect.ReflectTarget(java.lang.String,int) * public demo.reflect.ReflectTarget() * public demo.reflect.ReflectTarget(char) * **************所有的构造方法(包括私有的、受保护的、默认和公有的)************** * private demo.reflect.ReflectTarget(int) * protected demo.reflect.ReflectTarget(boolean) * public demo.reflect.ReflectTarget(java.lang.String,int) * demo.reflect.ReflectTarget(java.lang.String) * public demo.reflect.ReflectTarget() * public demo.reflect.ReflectTarget(char) * **************获取公有、带两个参数的构造方法************** * con = public demo.reflect.ReflectTarget(java.lang.String,int) * **************获取单个私有的构造方法************** * con = private demo.reflect.ReflectTarget(int) * ################################################## * **************通过私有构造方法创建实例************** * 私有的构造方法,序号:1 */

如何获取类的字段并使用

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwsps.html