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

spring IOC AOP

反射

Java反射是一种强大的机制,允许程序在运行时动态地获取类的内部信息,并直接操作类的属性和方法。通过反射,开发者可以在运行时检查类、接口、字段和方法,并调用这些方法或访问这些字段,而无需在编译时知道它们的名称。反射主要通过java.lang.reflect包实现,提供了一系列类和接口,用于获取和操作类及其成员。反射在许多框架和库中被广泛使用,例如Spring框架的依赖注入。

反射在 Java 中主要通过 java.lang.reflect 包实现,这个包提供了一系列类和接口,用于在运行时获取和操作类及其成员。

以下是 Java 反射的一些主要功能和用法:

  1. 获取类的信息:
    1. 使用 Class.forName(String className) 动态加载类,并返回对应的 Class 对象。
    2. 使用 Object.getClass() 获取对象的 Class 对象。
    3. 使用 Class<?> clazz = MyClass.class; 获取类的 Class 对象(静态方式)。
  2. 获取类的成员信息:
    1. 使用 Class.getMethods() 获取类的所有公共方法。
    2. 使用 Class.getDeclaredMethods() 获取类的所有方法(包括私有方法)。
    3. 使用 Class.getFields() 获取类的所有公共字段。
    4. 使用 Class.getDeclaredFields() 获取类的所有字段(包括私有字段)。
  3. 创建对象实例:
    1. 使用 Class.newInstance() 创建类的实例(需要无参构造函数)。
    2. 使用 Constructor<T>.newInstance(...) 创建类的实例(可以使用带参数的构造函数)。
  4. 调用方法:
    1. 使用 Method.invoke(Object obj, Object... args) 调用对象的方法。
  5. 访问和修改字段:
    1. 使用 Field.get(Object obj) 获取对象的字段值。
    2. 使用 Field.set(Object obj, Object value) 设置对象的字段值。

参考:
                        Java的反射是什么?超详细+举例子+通俗易懂版!-CSDN博客

反射三种方式

获取反射中的Class对象

在反射中,要获取一个类或调用一个类的方法,我们首先需要获取到该类的 Class 对象。

在 Java API 中,获取 Class 类对象有三种方法:

第一种,使用 Class.forName 静态方法。当你知道该类的全路径名时,你可以使用该方法获取 Class 类对象。

Class clz = Class.forName("java.lang.String");

第二种,使用 .class 方法。

这种方法只适合在编译前就知道操作的 Class。

Class clz = String.class;

第三种,使用类对象的 getClass() 方法。

String str = new String("Hello");
Class clz = str.getClass();

通过反射创建类对象

通过反射创建类对象主要有两种方式:通过 Class 对象的 newInstance() 方法、通过 Constructor 对象的 newInstance() 方法。

第一种:通过 Class 对象的 newInstance() 方法。

Class clz = Apple.class;
Apple apple = (Apple)clz.newInstance();

第二种:通过 Constructor 对象的 newInstance() 方法

Class clz = Apple.class;
Constructor constructor = clz.getConstructor();
Apple apple = (Apple)constructor.newInstance();

通过 Constructor 对象创建类对象可以选择特定构造方法,而通过 Class 对象则只能使用默认的无参数构造方法。下面的代码就调用了一个有参数的构造方法进行了类对象的初始化。

Class clz = Apple.class;
Constructor constructor = clz.getConstructor(String.class, int.class);
Apple apple = (Apple)constructor.newInstance("红富士", 15);

通过反射获取类属性、方法、构造器

我们通过 Class 对象的 getFields() 方法可以获取 Class 类的属性,但无法获取私有属性。

Class clz = Apple.class;
Field[] fields = clz.getFields();
for (Field field : fields) {
    System.out.println(field.getName());
}

输出结果是:

price

而如果使用 Class 对象的 getDeclaredFields() 方法则可以获取包括私有属性在内的所有属性:

Class clz = Apple.class;
Field[] fields = clz.getDeclaredFields();
for (Field field : fields) {
    System.out.println(field.getName());
}

输出结果是:

name
price

与获取类属性一样,当我们去获取类方法、类构造器时,如果要获取私有方法或私有构造器,则必须使用有 declared 关键字的方法。

参考:大白话说Java反射:入门、使用、原理 - 陈树义 - 博客园

待完善

相关文章:

  • 基于 RK3588 的 YOLO 多线程推理多级硬件加速引擎框架设计(代码框架和实现细节)
  • 【商城实战(96)】打造商城监控利器Prometheus与Grafana
  • AI预测3D新模型百十个定位预测+胆码预测+杀和尾+杀和值2025年3月31日第38弹
  • K个一组翻转链表--囊括半数链表题的思想
  • Android学习之计算器app(java + 详细注释 + 源码)
  • el-switch的before-change的使用方法
  • 解决wsl2下CentOS 7 的 yum 仓库无法连接问题
  • Vue舞台剧
  • AWS Lambda:无服务器架构如何重塑云计算,解锁企业敏捷开发与成本革命
  • 目标检测YOLO实战应用案例100讲-基于孤立森林算法的高光谱遥感图像异常目标检测(续)
  • Go语言从零构建SQL数据库引擎 - 开篇
  • 【C++游戏引擎开发】《线性代数》(4):矩阵求逆的LU分解实现(SIMD实现计算加速)
  • 某地81栋危房自动化监测试点项目
  • 深度学习图像分类数据集—五种艺术画风格分类
  • 开源AI大模型赋能的S2B2C商业生态重构研究——基于智能名片系统的体验认知与KOC背书机制
  • 单调自增的数字 斐波那契数列 爬楼梯
  • UML中的用例图和类图
  • npm webpack打包缓存 导致css引用地址未更新
  • C++ 结构体与函数
  • Java基础知识总结(1.8)——Java 注解(持续更新)
  • 低价网站建设推广报价/免费刷赞网站推广qq免费
  • 深圳建设网站培训机构/网站推广排名哪家公司好
  • 做卡贴的网站/网站外链代发
  • 福建省建设安全监督站的网站/长春seo顾问
  • 眼镜网站建设/今日财经最新消息
  • 网站建设推广费会计分录/谷歌chrome手机版