在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。我们把这种动态获取对象信息和调用对象方法的功能称之为反射机制。
反射中常用到的类
- Class类: 代表类的实体,在运行的Java应用程序中表示类和接口
- Field类: 代表类的属性
- Method类: 代表类的方法
- Constructor类: 代表类的构造方法
Class类
Class对象的由来是将class文件读入内存,并为之创建一个Class对象
Class类表示正在运行的java应用程序中的类和接口,也就是jvm中有N多的实例每个类都有该Class对象,包括基本数据类型
package com.my.concurrent.reflect;
import org.springframework.util.StringUtils;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* @author: chenmingyu
* @date: 2019/9/17 11:07
* @description:
*/
public class Reflect {
private String name;
private final int age = 25;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private Boolean isMy(String name) {
if(name.equals("my")){
return Boolean.TRUE;
}
return Boolean.FALSE;
}
@Override
public String toString() {
return "Reflect{" +
"name='" + name + '\'' +
'}';
}
}
获取class类的三种方式
// 第1种
Class var = Reflect.class;
System.out.println(var.getName());
// 第2种
Reflect var1 = new Reflect();
Class var2 =var1.getClass();
System.out.println(var2.getName());
// 第3种 常用
Class var3 = Class.forName("com.my.concurrent.reflect.Reflect");
System.out.println(var3.getName());
使用Class类创建实例
Class reflectClass = Class.forName("com.my.concurrent.reflect.Reflect");
Reflect reflect = (Reflect)reflectClass.newInstance();
reflect.setName("my");
System.out.println(reflect.toString());
Class 没有公共构造方法。Class对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的defineClass 方法自动构造的。也就是这不需要我们自己去处理创建,JVM已经帮我们创建好了
Field类
访问私有的属性
Class reflectClass = Class.forName("com.my.concurrent.reflect.Reflect");
Field ageField = reflectClass.getDeclaredField("age");
ageField.setAccessible(Boolean.TRUE);
int age = (int) ageField.get(reflect);
System.out.println(age);
Method类
执行私有方法
Class reflectClass = Class.forName("com.my.concurrent.reflect.Reflect");
Method method = reflectClass.getDeclaredMethod("isMy", String.class);
method.setAccessible(Boolean.TRUE);
Boolean result= (Boolean) method.invoke(reflect,"xn");
System.out.println(result);
Constructor类
通过Constructor类创建对象实例
Class reflectClass = Class.forName("com.my.concurrent.reflect.Reflect");
Constructor constructor = reflectClass.getConstructor();
Reflect constructorReflect = (Reflect) constructor.newInstance();
constructorReflect.setName("xn");
System.out.println(constructorReflect.toString());
在获取私有属性或者方法的时候要用方法中带有Declared的方法,这类方法可以反射到私有的方法和属性,没有Declared的只能用来反射公有的方法和属性