【Spring】第二弹:通过反射机制初步理解 IoC

server/2025/3/18 15:42:07/

一、Java 反射机制

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

反射关键APIjava.lang.Class+java.lang.reflect

1、首先我们创建一个 Car 类:

java">
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Car {//属性private String name;private int age;private String color;//普通方法private void run() {System.out.println("私有方法-run.....");}
}

2、通过反射获取类并实例化:

java">public class ReflectCar {/*** 输出结果:* class Ioc.Car* class Ioc.Car* class Ioc.Car* @param args* @throws ClassNotFoundException*/public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {// 获取Car类的三种方式Class<Car> carOldClass = Car.class;System.out.println(carOldClass);Class<? extends Car> newClass = new Car().getClass();System.out.println(newClass);Class<?> carClass = Class.forName("Ioc.Car"); //Car类的全路径System.out.println(carClass);/*** 获取Car的构造方法:无参构造和带参构造* 方法名称:Ioc.Car 参数个数:0* 方法名称:Ioc.Car 参数个数:3*/Constructor<?>[] carClassDeclaredConstructors = carClass.getDeclaredConstructors();for (Constructor<?> constructor : carClassDeclaredConstructors) {System.out.println("方法名称:"+constructor.getName()+" 参数个数:"+constructor.getParameterCount());}/*** 通过构造方法创建对象* Car(name=null, age=0, color=null)* Car(name=小黄车, age=1, color=黄色)*/Constructor<?> declaredConstructor1 = carClass.getDeclaredConstructor();Car car1 =(Car) declaredConstructor1.newInstance();System.out.println(car1);Constructor<?> declaredConstructor2 = carClass.getDeclaredConstructor(String.class, int.class, String.class);Car car2 = (Car)declaredConstructor2.newInstance("小黄车", 1, "黄色");System.out.println(car2);/*** 通过反射获取属性* Car(name=小绿车, age=1, color=黄色)* name* age* color*/Field[] declaredFields = carClass.getDeclaredFields();for (Field declaredField : declaredFields) {if(declaredField.getName().equals("name")){declaredField.setAccessible(true);declaredField.set(car2,"小绿车");System.out.println(car2);}System.out.println(declaredField.getName());}/*** 通过反射获取私有化方法* 私有方法-run.....*/Method[] methods = carClass.getDeclaredMethods();for (Method method : methods) {//执行方法if (method.getName().equals("run")){method.setAccessible(true);Object object = method.invoke(car2);}}}
}


http://www.ppmy.cn/server/175995.html

相关文章

Ubuntu 常用指令手册

&#x1f4c1; 文件/目录操作 1. 基础操作 # 递归复制目录&#xff08;含子目录&#xff09; cp -r source_dir/ target_dir/# 递归删除目录&#xff08;强制删除不提示&#xff09; rm -rf dir_name/# 查看当前路径 pwd# 创建多级目录 mkdir -p parent_dir/child_dir2. 权限…

正则表达式小结

正则表达式是一种用于描述文本模式的特殊字符串&#xff0c;它由一系列字符和特殊字符组成&#xff0c;用于匹配和操作文本数据。下面是正则表达式的一些常见规则&#xff1a; 字符匹配&#xff1a; 普通字符&#xff1a;正则表达式中的普通字符&#xff08;字母、数字、符号&a…

vue-router实现

实现一个简化版的 vue-router 可以帮助我们更好地理解 Vue 路由是如何工作的。Vue Router 主要的功能是基于浏览器的 URL 来管理组件的显示&#xff0c;能够根据 URL 变化切换不同的视图。下面是一个简化版的实现&#xff0c;用于帮助你理解基本的路由机制。 创建一个简单的 V…

【Python · Pytorch】Conda介绍 DGL-cuda安装

本文仅涉及DGL库介绍与cuda配置&#xff0c;不包含神经网络及其训练测试。 起因&#xff1a;博主电脑安装了 CUDA 12.4 版本&#xff0c;但DGL疑似没有版本支持该CUDA版本。随即想到可利用Conda创建CUDA12.1版本的虚拟环境。 1. Conda环境 1.1 Conda环境简介 Conda&#xff1…

基于ssm的电子病历系统(全套)

一、系统架构 前端&#xff1a;jsp | bootstrap | jquery 后端&#xff1a;spring | springmvc | mybatis 环境&#xff1a;jdk1.8 | mysql | maven | tomcat | idea 二、代码及数据库 三、功能介绍 01. 登录 02. 主页 03. 管理员-个人中心-修改密码…

uniapp scroll组件下拉刷新异步更新数据列表

前言 如图所示&#xff0c;下拉刷新&#xff0c;更新聊天列表。 开始 设置refresher-enabled“true”&#xff0c;开启自定义下拉刷新 设置refresher-default-style和refresher-background&#xff0c;可以自定义下拉刷新的样式 refresherrefresh为监听自定义下拉刷新被触发…

Markdig:强大的 .NET Markdown 解析器详解

在现代开发中&#xff0c;Markdown 已经成为了一种广泛使用的轻量级标记语言&#xff0c;特别是在文档、博客和内容管理系统中&#xff0c;Markdown 为开发者提供了快速、简洁的格式化文本方式。而在 .NET 生态中&#xff0c;Markdig 是一款非常强大的 Markdown 解析器&#xf…

Manus 一码难求,MetaGPT、OpenManus、Camel AI 会是替代方案吗?

Manus 一码难求&#xff0c;MetaGPT、OpenManus、Camel AI 会是替代方案吗&#xff1f; 一、Manus 的现象与问题 Manus 作为一款号称“全球首个通用 AI 智能体”的产品&#xff0c;凭借其强大的功能和新颖的营销策略迅速走红。然而&#xff0c;其封闭的邀请码机制和高昂的使用…