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

java中反射(Reflection)的4个作用

java中反射(Reflection)的4个作用

  • 作用1、在运行时判断任意一个对象所属的类
  • 作用2、在运行时构造任意一个类的对象
  • 作用3、在运行时判断任意一个类所具有的成员变量和方法
  • 作用4、在运行时调用任意一个对象的方法
  • 总结


💖The Begin💖点点关注,收藏不迷路💖

反射(Reflection)是Java等编程语言中的一个重要特性,它允许程序在运行时进行自我检查和对内部成员(如字段、方法、类等)的操作。本文将详细介绍反射的主要作用,并通过Java示例来说明。

作用1、在运行时判断任意一个对象所属的类

反射提供了getClass()方法,使得我们可以获取对象的运行时类信息。通过这个方法,我们可以判断一个对象属于哪个类。

Object obj = "Hello, Reflection!";  
Class<?> objClass = obj.getClass();  
System.out.println("对象所属类: " + objClass.getName()); // 输出: 对象所属类: java.lang.String

作用2、在运行时构造任意一个类的对象

通过反射,我们可以使用Class对象的newInstance()方法(或其替代方法如getDeclaredConstructor().newInstance())来动态地创建类的实例。

try {  
    Class<?> stringClass = String.class;  
    Object strInstance = stringClass.getDeclaredConstructor().newInstance();  
    // 注意:String类有一个无参构造器,否则上述代码会抛出异常  
    System.out.println("通过反射创建的String实例: " + strInstance); // 输出: 通过反射创建的String实例:   
} catch (Exception e) {  
    e.printStackTrace();  
}

作用3、在运行时判断任意一个类所具有的成员变量和方法

通过反射,我们可以获取类的所有成员变量(字段)和方法,并可以检查它们的修饰符、参数等信息。

Class<?> stringClass = String.class;  
  
// 获取所有公共字段  
Field[] fields = stringClass.getFields();  
for (Field field : fields) {  
    System.out.println("公共字段: " + field.getName());  
}  
  
// 获取所有方法(包括公共、保护、默认和私有)  
Method[] methods = stringClass.getDeclaredMethods();  
for (Method method : methods) {  
    System.out.println("方法: " + method.getName());  
}

作用4、在运行时调用任意一个对象的方法

通过反射,我们可以调用对象的任何可见(public)或私有(private,通过setAccessible(true)方法)方法。

try {  
    String str = "Hello";  
    Class<?> stringClass = str.getClass();  
    Method lengthMethod = stringClass.getMethod("length");  
    int length = (int) lengthMethod.invoke(str);  
    System.out.println("字符串长度: " + length); // 输出: 字符串长度: 5  
} catch (Exception e) {  
    e.printStackTrace();  
}

总结

反射提供了强大的运行时操作类、对象、字段和方法的能力,这使得Java等语言更加灵活和动态。

然而,反射也有一些缺点,比如性能开销较大,并且可能会破坏封装性。

在这里插入图片描述


💖The End💖点点关注,收藏不迷路💖

http://www.kler.cn/a/534357.html

相关文章:

  • Three.js 后期处理(Post-Processing)详解
  • neo4j-在Linux中安装neo4j
  • axios如何利用promise无痛刷新token
  • [25] cuda 应用之 nppi 实现图像色彩调整
  • 记录一次-Rancher通过UI-Create Custom- RKE2的BUG
  • Verilog基础(三):过程
  • [Python人工智能] 四十九.PyTorch入门 (4)利用基础模块构建神经网络并实现分类预测
  • 我的鸿蒙学习之旅:探索万物互联的新宇宙
  • 产品经理的人工智能课 02 - 自然语言处理
  • 穷举vs暴搜vs深搜vs回溯vs剪枝系列一>黄金矿工
  • 移动机器人规划控制入门与实践:基于navigation2 学习笔记(一)
  • 【Uniapp-Vue3】从uniCloud中获取数据
  • Vue全流程--Vue2组件的理解第二部分
  • Docker深度解析:Docker Compose
  • 巧用 DeepSeek,让 Excel 数据处理更高效
  • Springboot项目编写测试单元步骤
  • 北大AGI与具身智能评估新范式!Tong测试:基于动态具身物理和社会互动的评估标准
  • 【go语言】protobuf 和 grpc
  • mixin
  • STM32 串口收发数据包
  • 基于springboot+vue的青少年心理健康教育网站的设计与实现
  • Qt跨屏窗口的一个Bug及解决方案
  • FRP通过公网IP实现内网穿透
  • 日期选择控件,时间跨度最大一年。
  • springboot停车场管理系统设计与实现
  • 【高级篇 / IPv6】(7.2) ❀ 04. 在60E上配置ADSL拨号宽带上网(IPv4) ❀ FortiGate 防火墙