Java 反射机制


参考文章:

  老顽童周伯通 知乎上的回答

  深入解析Java反射(1) - 基础

 


 

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);

且将新火试新茶,诗酒趁年华。
原文地址:https://www.cnblogs.com/share23/p/9562541.html