在 `JDK 17` 中使用反射

打印 上一主题 下一主题

主题 570|帖子 570|积分 1714

在 JDK 17 中使用反射的基本步调如下:

步调一:导入相关类

  1. import java.lang.reflect.Field;
  2. import java.lang.reflect.Method;
  3. import java.lang.reflect.Constructor;
复制代码
步调二:获取类对象

  1. // 通过类的全限定名获取 Class 对象
  2. Class<?> clazz = Class.forName("your.package.YourClass");
复制代码
步调三:操作字段

  1. // 获取指定名称的字段
  2. Field field = clazz.getDeclaredField("yourFieldName");
  3. // 设置字段可访问
  4. field.setAccessible(true);
  5. // 获取字段的值
  6. Object fieldValue = field.get(yourObjectInstance);
复制代码
步调四:操作方法

  1. // 获取指定名称和参数类型的方法
  2. Method method = clazz.getDeclaredMethod("yourMethodName", parameterTypes);
  3. // 设置方法可访问
  4. method.setAccessible(true);
  5. // 调用方法
  6. method.invoke(yourObjectInstance, parameters);
复制代码
步调五:操作构造函数

  1. // 获取指定参数类型的构造函数
  2. Constructor<?> constructor = clazz.getDeclaredConstructor(parameterTypes);
  3. // 设置构造函数可访问
  4. constructor.setAccessible(true);
  5. // 创建对象实例
  6. Object object = constructor.newInstance(parameters);
复制代码

以下是一个简单的示例,演示如何在 JDK 17 中使用反射来获取类的私有字段和调用私有方法:
  1. import java.lang.reflect.Field;
  2. import java.lang.reflect.Method;
  3. class Person {
  4.     private String name;
  5.     private void sayHello() {
  6.         System.out.println("Hello, I'm " + name);
  7.     }
  8.     public Person(String name) {
  9.         this.name = name;
  10.     }
  11. }
  12. public class ReflectionExample {
  13.     public static void main(String[] args) throws Exception {
  14.         // 获取 Person 类的 Class 对象
  15.         Class<?> clazz = Person.class;
  16.         // 创建 Person 对象
  17.         Object personObject = clazz.getDeclaredConstructor(String.class).newInstance("Alice");
  18.         // 获取私有字段 name
  19.         Field nameField = clazz.getDeclaredField("name");
  20.         nameField.setAccessible(true);
  21.         String name = (String) nameField.get(personObject);
  22.         System.out.println("Name: " + name);
  23.         // 获取私有方法 sayHello 并调用
  24.         Method sayHelloMethod = clazz.getDeclaredMethod("sayHello");
  25.         sayHelloMethod.setAccessible(true);
  26.         sayHelloMethod.invoke(personObject);
  27.     }
  28. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

东湖之滨

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表