Java 反射机制
参考文章:
1. Java反射机制
1.1 什么 Java 反射机制
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法和属性;
这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。
1.2 为什么用反射
当程序在运行时,需要动态的加载一些类这些类可能之前用不到所以不用加载到 JVM,而是在运行时根据需要才加载,这样的好处对于服务器来说不言而喻,举个例子我们的项目底层有时是用 MySQL,有时用 Oracle,需要动态地根据实际情况加载驱动类,这个时候反射就有用了。
假设 com.java.dbtest.myqlConnection,com.java.dbtest.oracleConnection 这两个类我们要用,这时候我们的程序就写得比较动态化,通过Class tc = Class.forName("com.java.dbtest.TestConnection"); 通过类的全类名让 JVM 在服务器中找到并加载这个类。而如果是 Oracle 则传入的参数就变成另一个了。这时候就可以看到反射的好处了,这个动态性就体现出 Java 的特性了!
反射的核心是 JVM 在运行时才动态加载类或调用方法/访问属性
反射一般用于框架中,在使用 Spring Boot 框架过程中使用的一些配置文件都是反射在框架中的应用。
1.3 反射的使用
所有的类,都存在一个类对象。类对象就是用于描述这种类包含的属性与方法。
下面是获取类对象的三种方式
1.3.1 使用 Class 类的 forName 静态方法
//forName方法 public static Class<?> forName(String className) //在JDBC开发中常用此方法加载数据库驱动: Class.forName(driver);
1.3.2 直接获取一个对象的 Class
Class class2 = Student.class; System.out.println(class2);
1.3.3 调用某个对象的 getClass() 方法
StringBuilder str = new StringBuilder("123"); Class<?> klass = str.getClass();
1.4 成员变量
方法
//返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段 getField(String name) //返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段 getFields() //返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段 getDeclaredField(String name) //给某个对象的本成员变量赋值为value set(Object obj,Object value)
1.5 构造方法
方法
//通过参数的类型和个数获取指定的构造方法,只能是公共的构造
Constructor con = clazz.getConstructor(String.class);
//获取非public修饰的,加Declared.
Constructor con = clazz.getDeclaredConstructor(String.class);
//(设置可访问性)暴力破解
con.setAccessible(true);
//创建此 Class 对象所表示的类的一个新实例
Object obj = con.newInstance(10L);
demo
//空参构造 Class c = Class.forName(“com.test.Person”); Constructor con = c.getConstructor();//获取空参构造方法 Object obj = con.newInstance();//创建对象 //带参构造 Class c = Class.forName(“com.Person”); Constructor con = c.getConstructor(String.class,int.class); Object obj = con.newInstance(“tom”,11); //通过带Declared字样的方法获取指定的构造方法 Class c = Class.forName(“com.Person”); Constructor con = c.getDeclaredConstructor(String.class); Object obj = con.newInstance(11);
1.6 成员方法
方法
//无参无返回值 //获取所有的公共成员方法 getMethods() //获取所有成员方法 getDeclaredMethods() //获取指定的公共成员方法 getMethod(String name) //获取指定的成员方法 getDeclaredMethod(String name) setAccessible(boolean bool) //有参有返回值 Class c = Class.forName(); Method m = c.getDeclaredMethod(“setAge”,int.class); Person p = new Person(); Object obj = m.invoke(p,20);
且将新火试新茶,诗酒趁年华。