前言
平时在项目开发时很少用到Java反射,偶尔在某个项目中才实际用到它。其实Spring控制反转和切面编程都涉及到Java反射。控制反转通过反射机制来实现依赖注入,而切面编程则通过反射机制来动态地代理目标对象并在方法执行前后进行增强操作。因此,Java反射是Spring框架中非常重要的一部分。
一、基本概念
1.何为Java反射机制
Java反射机制是指在程序运行时动态地获取Class类的信息、属性、方法等以及动态调用对象的方法的功能。
2.作用是啥?
(1)通过Java反射机制,可以在运行时获取类的名称、属性和方法等信息,并且可以在运行时调用对象的方法和属性。
(2)Java反射机制是Java语言的一种特性,它使得Java程序可以在运行时动态地加载、探知和使用编译期间完全未知的类。
(3)Java反射机制为Java程序的动态性提供了很大的支持,使得Java程序可以更加灵活和智能。
3.如何获取Class对象
(1)可通过类名.class
(2)实例对象.getClass()
(3)Class.forName("类名")
二、使用方式
1.获取字段名/方法名
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws Exception {
Class clazz = Orange.class;
System.out.println(clazz.getField("name"));
Field[] fields = clazz.getFields();
System.out.println("fields -> " + Arrays.toString(fields));
Field[] declaredFields = clazz.getDeclaredFields();
System.out.println("declaredFields -> " + Arrays.toString(declaredFields));
Method[] methods = clazz.getMethods();
System.out.println("methods -> " + Arrays.toString(methods));
}
}
class Orange extends Fruit {
public int weight; // 重量
private String color; // 颜色
private boolean mature; // 成熟
@Override
public String toString() {
return "Orange{" +
"name=" + name +
", color='" + color + '\'' +
", mature=" + mature +
", weight='" + weight + '\'' +
'}';
}
}
class Fruit {
public String name;
}
2.获取字段值
import java.lang.reflect.Field;
public class Main {
public static void main(String[] args) throws Exception {
Car car = new Car("兰博基尼");
Class clazz = car.getClass();
Field name = clazz.getDeclaredField("name");
name.setAccessible(true); // 屏蔽Java语言的访问检查
Object value = name.get(car);
System.out.println(value); // 兰博基尼
}
}
class Car {
private String name;
public Car(String name) {
this.name = name;
}
}
3.修改字段值
import lombok.Data;
import java.lang.reflect.Field;
public class Main {
public static void main(String[] args) throws Exception {
Car car = new Car("兰博基尼");
Class clazz = car.getClass();
Field name = clazz.getDeclaredField("name");
name.setAccessible(true); // 屏蔽Java语言的访问检查
Object value = name.get(car);
System.out.println(value); // 兰博基尼
name.set(car, "玛莎拉蒂");
System.out.println(car.getName()); // 玛莎拉蒂
}
}
@Data
class Car {
private String name;
public Car(String name) {
this.name = name;
}
}
4.调用方法
import lombok.Data;
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args) throws Exception {
Car car = new Car("兰博基尼");
Class clazz = car.getClass();
Method method = clazz.getDeclaredMethod("fn");
method.setAccessible(true); // 屏蔽Java语言的访问检查
method.invoke(car, null); // 通过调用invoke方法来执行目标方法
}
}
@Data
class Car {
private String name;
public Car(String name) {
this.name = name;
}
public void fn() {
System.out.println("666");
}
}