反射是Java中最强大的技术了,但是java反射影响性能
1、获取Class对象的三种方式 1.1 Object ——> getClass(); 1.2 任何数据类型(包括基本数据类型)都有一个“静态”的class属性 1.3 通过Class类的静态方法:forName(String className)
public class Student { private String name; private Integer age; private List<String> hobbys; public Student() { } public Student(String name, Integer age, List<String> hobbys) { this.name = name; this.age = age; this.hobbys = hobbys; } }反射创建对象 反射获取构造方法
/* * 通过Class对象可以获取某个类中的:构造方法、成员变量、成员方法;并访问成员; * * 1.获取构造方法: * 1).批量的方法: * public Constructor[] getConstructors():所有"公有的"构造方法 public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有) * 2).获取单个的方法,并调用: * public Constructor getConstructor(Class... parameterTypes):获取单个的"公有的"构造方法: * public Constructor getDeclaredConstructor(Class... parameterTypes):获取"某个构造方法"可以是私有的,或受保护、默认、公有; * * 调用构造方法: * Constructor-->newInstance(Object... initargs) */当类中方法定义为私有的时候我们不能调用 当变量是私有的时候我们不能获取 但是反射可以,可以通过反射去执行这个私有方法,并且获取私有变量
测试类
public class Test{ private Integer age; private String name; private Integer intTest; public Test() { } public Test(Integer age) { this.age = age; } public Test(Integer age, String name) { this.age = age; this.name = name; } public Test(String name) { this.name = name; } }1.1 获取所有的构造方法
1.2 通过反射构造方法创建对象
Constructor declaredConstructor = aClass.getDeclaredConstructor(Integer.class, String.class); Object newInstance1 = declaredConstructor.newInstance(18, "简素言"); System.out.println(newInstance1); Constructor declaredConstructor1 = aClass.getDeclaredConstructor(String.class); declaredConstructor1.setAccessible(true); Object newInstance2 = declaredConstructor1.newInstance("裴罗嘉"); System.out.println(newInstance2);1.3 私有化构造方法创建对象
私有方法执行,公有方法执行 在Test类中加入两个方法,一个私有,一个公共 getDeclaredMethod方法获取到这个私有方法,第一个参数是方法名,第二个参数是参数类型。然后通过invoke方法执行,invoke需要两个参数一个是类的实例,一个是方法参数。
2.1 获取指定的方法并执行
Method play = aClass.getDeclaredMethod("play", null); play.invoke(test,null); Method say = aClass.getDeclaredMethod("say", String.class); Object stringSay="you are J-Dragon"; say.setAccessible(true); say.invoke(test,stringSay);2.2 获取该类所有方法