当前位置: 首页 > news >正文

【Java 反射机制】

Java 反射机制

  • 反射的核心类
  • 获取 Class 对象的三种方式
  • 反射的基本操作
    • 创建对象
    • 访问字段
    • 反射可以绕过泛型检查:

反射的核心类

类名作用
Class代表类的元数据
Field代表类的成员变量
Method代表类的方法
Constructor代表类的构造方法
Array提供动态创建和访问数组的方法

获取 Class 对象的三种方式

// 1. 通过类名.class
Class<?> clazz1 = String.class;// 2. 通过对象.getClass()
String str = "Hello";
Class<?> clazz2 = str.getClass();// 3. 通过Class.forName()
Class<?> clazz3 = Class.forName("java.lang.String");

反射的基本操作

创建对象

// 通过无参构造方法创建实例
Class<?> clazz = Class.forName("com.example.User");
Object obj = clazz.newInstance();  // 已废弃,推荐使用下面的方式// 通过有参构造方法创建实例
Constructor<?> constructor = clazz.getConstructor(String.class, int.class);
Object obj = constructor.newInstance("张三", 25);

访问字段

public class Main {public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {// 1. 创建测试对象User user = new User("张三", 20);// 2. 获取Class对象Class<?> clazz = user.getClass();// 3. 操作public字段Field publicField = clazz.getField("name");Object nameValue = publicField.get(user);System.out.println("反射获取name: " + nameValue);// 反射获取name: 张三publicField.set(user, "李四");System.out.println("修改name后: " + user);// 修改name后: User(name=李四, age=20)// 4. 操作private字段Field privateField = clazz.getDeclaredField("age");privateField.setAccessible(true); // 解除private限制Object ageValue = privateField.get(user);System.out.println("反射获取age: " + ageValue);// 反射获取age: 20privateField.set(user, 30);System.out.println("修改age后: " + user);// 修改age后: User(name=李四, age=30)// 获取public方法Method publicMethod = clazz.getMethod("setName", String.class);// 调用方法publicMethod.invoke(user, "王二狗");System.out.println("调用setName后: " + user);// 调用setName后: User(name=王二狗, age=30)// ================== 调用private方法 ==================// 获取private方法Method privateMethod = clazz.getDeclaredMethod("privateMethod");// 解除private限制privateMethod.setAccessible(true);// 调用方法privateMethod.invoke(user);}
}@Data
@AllArgsConstructor
// 可序列化的User类
public class User implements Serializable {public String name;  // public字段private int age;     // private字段
}

反射可以绕过泛型检查:

 List<String> list = new ArrayList<>();list.add("hello");Method addMethod = list.getClass().getMethod("add", Object.class);addMethod.invoke(list, 100);  // 绕过了泛型检查System.out.println(list);  // 输出: [hello, 100] (包含String和Integer)
http://www.dtcms.com/a/530011.html

相关文章:

  • 2016年网站设计风格山西seo网站设计
  • 局域网建设网站视频教程网站制作都包括什么
  • 网站建设工作推进会上的讲话在电商网站上做推广的技巧
  • 公司做网络推广哪个网站好网络推广专员好做吗
  • 最优传输理论学习(1)+PINN文献阅读
  • 网站关键词几个好wordpress 徽标
  • 培训网站项目ppt怎么做东莞网站优化案例
  • 如何建团购网站网站建设推广襄樊
  • C++数据结构【顺序表和Vector】
  • mujoco 仿真导纳控制律
  • 做引流去那些网站好网站挖掘工具
  • 西安免费自助建站模板淄博seo排名
  • 在线商城的程序源代码
  • 网站图片大小大连事件最新消息
  • 网站 设计 语言注册资金1000万实际需要多少钱
  • 做网站的市场网站建设预算明细
  • 学生管理系统升级
  • 网站解析密码宁波led网站建设
  • 襄阳住房和城乡建设局网站秦皇岛市房价
  • 建站如何收费wordpress博客价格
  • 电商网站开发技术上海网站建设高端定制
  • 大规模TSP问题规划方案中的避坑事项
  • 什么是代理隧道?代理隧道用来做什么?
  • FMC-DETR:面向航拍视角目标检测的频域解耦多域协同方法
  • 秦皇岛公司做网站工装公司是做什么的
  • 周浦网站建设公司网站开发支付功能怎么做
  • 猎头做单都有什么网站易点科技网站建设
  • 建网站软件最新网站建设项目可行性研究报告
  • 【Shell】echo命令
  • 专做奢侈品品牌的网站宁波seo深度优化平台