# 反射机制

Java 的反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用方法的功能称为 java 语言的反射机制。

# java 反射机制的作用

  • 用来编写一些通用性较高的代码或者框架的时候使用

# 反射常用对象

  • Class:Class 类的实例表示正在运行的 Java 应用程序中的类和接口(类的字节码文件被加载到内存所形成的一个对象)
  • Constructor:关于类的单个构造方法的信息以及对它的访问权限
  • Field:提供有关类或接口的单个字段的信息以及对它的动态访问权限
  • Method:提供关于类或接口上单独某个方法的信息

# Class 类

  • Java 中 java.lang.Class 类用于表示一个类的字节码(.class)文件
  • 如何得到某个 class 文件对应的 Class 对象
    • 已知类和对象的情况下
      类名.class
      对象.getClass() -- Object 类提供
    • 未知类和对象的情况下
      Class.forName("包名.类名")
  • Class 类代表某个类的字节码并提供了加载字节码的方法:forName("包名.类名"),forName 方法用于加载类字节码到内存并封装成一个 Class 对象
Class clazz1 = Person.class;
Person person = new Person();
Class clazz2 = person.getClass();
Class clazz3 = Class.forName("com.reflect.Person");

# Constructor 类

  • Constructor 类的实例对象代表类的一个构造方法
  • 得到某个类所有的构造方法
    Constructor[] constructors = Class.forName("java.lang.String").getConstructors();
  • 得到指定的构造方法并调用
    Constructor constructor = Class.forName("java.lang.String").getConstructor(String.class);
    String str = (String)constructor.newInstance("abc");
  • Class 类的 newInstance()方法用来调用类的默认构造方法
    String obj = (String)Class.forName("java.lang.String").newInstance();
Class class1 = Class.forName("com.reflect.Person");
Constructor c = class1.getConstructor(); // 获得默认构造
Person person = (Person)c.newInstance(); // 相当于 new Person()
person.eat();
Constructor c1 = class1.getConstructor(String.class, String.class);
Person person1 = (Person)c1.newInstance("张三", "男"); // 相当于 new Person("张三","男")
System.out.println(person);

# Field 类

  • Field 类代表某个类中的一个成员变量并提供动态的访问权限
  • Field 对象的获得
    • 得到所有的成员变量
      Field[] fields = c.getFields(); // 取得所有 public 属性(包括父类继承)
      Field[] fields = c.getDeclaredFields(); // 取得所有声明的属性(包括私有属性)
    • 得到指定的成员变量
      Field name = c.getField("name");
      Field name = c.getDeclaredField("name");
  • 设置 Field 变量是否可以访问
    field.setAccessible(boolean);
  • Field 变量值得读取和设置
    field.get(obj);
    field.set(obj,value);
Class class1 = Class.forName("com.reflect.Person");
Field field = class1.getField("name");
Person p = (Person)class1.newInstance();
field.set(p, "李四"); // p.name = "李四";
Object obj = field.get(p);
System.out.println(obj);

Field field1 = class1.getDeclaredField("sex");
// 私有属性需要设置可访问权限
field1.setAccessible(true);
field1.set(p, "男");
Object obj = field1.get(p);

# Method 类

  • Method 类代表某个类中的一个成员方法
  • Method 对象的获得
    • 获得所有方法
      getMethods()
      getDeclaredMethods()
    • 获得指定方法
      getMethod(String name, Class<?>... parameterTypes)
      getDeclaredMethod(String name, Class<?>... parameterTypes)
  • 通过反射执行方法
    invoke(Object obj, Object... args)
Class class1 = Class.forName("com.reflect.Person");
Person person = (Person)class1.newInstance();
Method method = class1.getMethod("eat");
method.invoke(person); // person.eat()
Method method1 = class1.getDeclaredMethod("run");
method.setAccessible(true);
method.invoke(person);
Method method2 = class1.getMethod("sayHello", String.class);
method2.setAccessible(true);
Object obj = method2.invoke(person, "Tom");
上次更新: 2/13/2025, 3:29:47 AM