Java后端开发day48--反射动态代理

news2025/5/14 11:29:11

请添加图片描述
(以下内容全部来自上述课程)
在这里插入图片描述

反射

反射允许对成员变量,成员方法和构造方法的信息进行编程访问。
请添加图片描述
就是获取里面的成员变量、构造方法和成员方法,idea中打代码跳出来的提示就是反射。
请添加图片描述
请添加图片描述

1. 获取class对象的三种方式

  1. Class.forName(“全类名”); (最常用)
  2. 类名.class
  3. 对象.getClass();
    依次对应下述三个阶段。
    请添加图片描述
//1.第一种方式
//全类名:包名+类名
Class clazz1 = Class.forName("com.itheima.myreflect1.Student");
//2.第二种方式
Class clazz2 = Student.class;
//3.第三种方式
Student s = new Student(); 
Class clazz3 = s.getClass();

2. 反射获取构造方法

declared:有权限修饰符修饰的,就是所有的。
请添加图片描述

//1.获取class字节码文件对象
Class clazz = Class.forName("com.itheima.myreflect2.Student");
//2.获取构造方法
/* Constructor[] cons1 = clazz.getConstructors(); 
for (Constructor con : cons1){
	System.out.print1n(con);
}
Constructor[] cons2 = clazz.getDeclaredConstructors(); 
for (Constructor con : cons2){
	System.out.println(con);
	}*/

//无参构造  -- 看下面图
Constructor con1 = clazz.getDeclaredConstructor(); 
System.out.println(con1);

请添加图片描述

Constructor con4 = clazz.getDeclaredConstructor(String.class,int.class); 
//暴力反射:表示临时取消权限校验 
con4.setAccessible(true);
Student stu = (Student) con4.newInstance(...initargs:"张三"23);
System.out.println(stu);

3. 反射获取成员变量

请添加图片描述

//1.获取class字节码文件的对象
Class clazz = Class.forName("com.itheima.myreflect3.Student");
//2.获取所有的成员变量
/* Field[] fields = clazz.getDeclaredFields(); 
	for (Field field : fields){
System.out.println(field);
}*/
//获取单个的成员变量
Field name = clazz.getDeclaredField( name: "name"); 
System.out.println(name);
//获取权限修饰符
int modifiers = name.getModifiers(); 
System.out.println(modifiers);
//获取成员变量的名字
String n = name.getName(); 
System.out.println(n);
//获取成员变量的数据类型
Class<?> type = name.getType(); 
System.out.println(type);
//获取成员变量记录的值
Student s = new Student( name: "zhangsan", age: 23, gender: "男"); 
name.setAccessible(true);
String value =(String) name.get(s); 
System.out.println(value);
//修改对象里面记录的值 
name.set(s,"lisi");
System.out.println(s);

4. 反射获取成员方法

请添加图片描述

//1.获取class字节码文件对象
Class clazz = Class.forName("com.itheima.myreflect4.Student");
//2.获取里面所有的方法对象(包含父类中所有的公共方法)
/* Method[] methods = clazz.getMethods(); 
for (Method method : methods){
	System.out.println(method);
	}*/
// 获取里面所有的方法对象(不能获取父类的,但是可以获取本类中私有)
/*Method[] methods = clazz.getDeclaredMethods(); 
for (Method method : methods) {
	System.out.println(method);
	}*/
// 获取指定的单一方法
Method m = clazz.getDeclaredMethod( name: "eat", String.class); 
System.out.println(m);
// 获取方法的修饰符
int modifiers = m.getModifiers(); 
System.out.println(modifiers);
// 获取方法的名字
String name = m.getName(); 
System.out.println(name);
// 获取方法的形参
Parameter[] parameters = m.getParameters(); 
for (Parameter parameter : parameters){
	System.out.print1n(parameter);
}
//获取方法的抛出的异常
Class[] exceptionTypes = m.getExceptionTypes(); 
for (Class exceptionType : exceptionTypes) {
	System.out.println(exceptionType);
}

请添加图片描述

5. 反射的作用

  1. 获取一个类中所有的信息,获取到了之后,再执行其他的业务逻辑
  2. 结合配置文件,动态的创建对象并调用方法

动态代理

特点:无侵入式的给代码增加额外的功能
请添加图片描述

1. 程序为什么需要代理

对象如果嫌身上干的事太多的话,可以通过代理来转移部分职责。
对象有什么方法想被代理,代理一定要有对应的方法。
请添加图片描述
中介如何知道派要有唱歌,跳舞方法的代理呢? --> 接口

2. 如何为Java对象创建一个代理对象

请添加图片描述
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2375337.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ValueError: Caught ValueError in DataLoader worker process 0.

参考链接&#xff1a; https://stackoverflow.com/questions/1841565/valueerror-invalid-literal-for-int-with-base-10 它提示我有个地方值错误空字符 果然因为格式处理没有传进去东西&#xff0c;找下原因&#xff0c;让它正常处理 原来是相对路径的.影响了程序运行 将v…

【数据结构】——链表OJ(下)

前面我们已经刷了几道单链表的题目&#xff0c;下面我们继续看几道题目。 一、相交链表 这道题题目的要求是很好理解的&#xff0c;就是现在我们有两个链表&#xff0c;然后我们就相办法进行判断&#xff0c;这两个链表是否是相交的&#xff0c;那么链表的相交其实就是有没有共…

Adobe Acrobat pro在一份PDF中插入空白页

在Adobe Acrobat pro中先打开我们的PDF文件&#xff1b; 用鼠标点击需要插入空白页处的上一页&#xff1b; 然后如下图操作&#xff1a; 默认会在光标处的下一页插入一张空白页&#xff0c;你也可以修改插入页的页码或者向前一页插入

java-----异常

对于Error&#xff1a;表示系统级错误或者资源耗尽的状况&#xff0c;像OutOfMemoryError、StackOverflowError等。这类错误是程序无法处理的&#xff0c;通常也不应该尝试去处理。 对于Exception&#xff1a;表示程序可以处理的异常。它又能细分为&#xff1a; 受检查异常&a…

[工具]B站缓存工具箱 (By 郭逍遥)

&#x1f4cc; 项目简介 B站缓存工具箱是一个多功能的B站缓存工具&#xff0c;包含视频下载、缓存重载、文件合并及系统设置四大核心功能。基于yutto开发&#xff0c;采用图形化界面操作&#xff0c;极大简化B站资源获取与管理流程。 工具可以直接将原本缓存的视频读取&#…

自动化测试与功能测试详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 什么是自动化测试? 自动化测试是指利用软件测试工具自动实现全部或部分测试&#xff0c;它是软件测试的一个重要组成 部分&#xff0c;能完成许多手工测试无…

CSS经典布局之圣杯布局和双飞翼布局

目标&#xff1a; 中间自适应&#xff0c;两边定宽&#xff0c;并且三栏布局在一行展示。 圣杯布局 实现方法&#xff1a; 通过float搭建布局margin使三列布局到一行上relative相对定位调整位置&#xff1b; 给外部容器添加padding&#xff0c;通过相对定位调整左右两列的…

OpenCV 的 CUDA 模块中用于将多个单通道的 GpuMat 图像合并成一个多通道的图像 函数cv::cuda::merge

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 OpenCV 的 CUDA 模块中&#xff0c;cv::cuda::merge 函数用于将多个单通道的 GpuMat 图像合并成一个多通道的图像。该函数是 cv::merge 的 GP…

计网实验笔记(一)CS144 Lab

Lab0 ByteStream : 实现一个在内存中的 有序可靠字节流Lab1 StreamReassembler&#xff1a;实现一个流重组器&#xff0c;一个将字节流的字串或者小段按照正确顺序来拼接回连续字节流的模块Lab2 TCPReceiver&#xff1a;实现入站字节流的TCP部分。Lab3 TCPSender&#xff1a;实…

什么是ERP?ERP有哪些功能?小微企业ERP系统源码,SpringBoot+Vue+ElementUI+UniAPP

什么是ERP&#xff1f; ERP翻译过来叫企业资源计划&#xff0c;通俗的讲&#xff0c;应该叫企业的全面预算控制&#xff0c;其通常包括三个部分&#xff1a;工程预算、投资预算和经营预算&#xff08;即产销存预算&#xff09;。之所以做预算控制&#xff0c;是因为企业运作的…

dockerfile: PaddleOCR hubserving api 服务

前言 目前 OCR 有比较成熟的方案&#xff0c;想着直接通过 docker 部署一个提供 api 接口服务&#xff0c;查看了一些开源方案&#xff0c;最终发现还是 PaddleOCR 比较好用。 本篇不介绍 PaddleOCR 的详细使用方式&#xff0c;只介绍一下构建镜像的 dockerfile 需要注意的事…

Vue3+uniapp 封装axios

1.第一步在项目根目录新建utils文件夹&#xff0c;里边新建两个文件request.js和uni-api-promisify.js 2.request.js 代码 要安装axios import axios from axios import { showToast } from /utils/uni-api-promisify// 创建axios实例 const service axios.create({baseURL:…

QEMU模拟32位ARM实现自定义系统调用

实现自定义系统调用 如何使用 QEMU 模拟32位 ARM 环境参考&#xff1a;使用Qemu模拟32位ARM系统 修改linux内核源码 使用 linux-4.4.240 源码&#xff0c;下载链接&#xff1a;下载链接 在 arch\arm\include\uapi\asm\unistd.h 文件下新增系统调用 sys_test&#xff1a; /…

MySQL——数据类型表的约束

目录 数据类型 数值类型 tinyint类型 bit类型 float类型 decimal类型 字符类型 char类型 varchar类型 日期和时间类型 选择类型 表的约束 null default comment zerofill primary key auto_increment unique key foreign key 数据类型 在MySQL中的数据类…

# YOLOv2:目标检测的升级之作

YOLOv2&#xff1a;目标检测的升级之作 在目标检测领域&#xff0c;YOLO&#xff08;You Only Look Once&#xff09;系列算法以其高效的速度和创新的检测方式受到了广泛关注。今天&#xff0c;我们就来深入探讨一下 YOLOv2&#xff0c;看看它是如何在继承 YOLOv1 的基础上进行…

【爬虫】DrissionPage-1

官网地址&#xff1a;DrissionPage官网 小需求采集&#xff0c;我喜欢&#xff0c;我要学。 1 介绍 这是用python编写的爬虫自动化工具&#xff0c;将Selenium 和 Requests 的功能巧妙地整合在一起&#xff0c;提供了统一又简单的操作接口。开发者可以在浏览器模式&#xff0…

Oracle OCP认证考试考点详解083系列15

题记&#xff1a; 本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 71. 第71题&#xff1a; 题目 解析及答案&#xff1a; 关于在 Oracle 18c 及更高版本中基于 Oracle 黄金镜像的安装&#xff0c;以下哪…

部署大模型:解决ollama.service: Failed with result ‘exit-code‘的问题

起因是这样: Loaded: loaded (/etc/systemd/system/ollama.service; disabled; preset: enabled) Active: activating (auto-restart) (Result: exit-code) since Tue 2025-05-13 19:31:19 CST; > Process: 12272 ExecStart/usr/bin/ollama serve (codeexited, status1/FAI…

Spring AI 开发本地deepseek对话快速上手笔记

Spring AI Spring AI是一个旨在推进生成式人工智能应用程序发展的项目&#xff0c;Spring AI的核心目标是提供高度抽象化的组件&#xff0c;作为开发AI应用程序的基础&#xff0c;使得开发者能够以最少的代码改动便捷地交换和优化功能模块‌ 在开发之前先得引入大模型&#xf…

SpringBoot中的拦截器

SpringBoot中的拦截器 Filter 典型场景 全局鉴权/接口耗时统计 WebFilter("/*") public class CostFilter implements Filter {Overridepublic void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {long start System.currentTimeMill…