Java反射和动态代理
反射
反射允许对封装类的成员变量、成员方法和构造方法的信息进行编程访问
成员变量:修饰符、名字、类型、get/set值
构造方法:修饰符、名字、形参、创建对象
成员方法:修饰符、名字、形参、返回值、抛出的异常、获取注解、运行方法
获取class对象
- Class.forName(“全类名”);全类名是包名加类名
- 类名.class
- 对象.getClass();
在源代码阶段可以使用第一种方法(最常用)
在加载阶段可以使用第二种方法(当参数传递)
在运行阶段可以使用第三种方法(当已经有了这个类的对象的时候才可以调用)
构造方法的对象—Constructor
变量(字段)的对象—Field
成员方法—Method
Class consumer = Class.forName("Consumer");Constructor[] constructors = consumer.getConstructors();for (int i = 0; i < constructors.length; i++)System.out.println(constructors[i]);Constructor[] declaredConstructors = consumer.getDeclaredConstructors();Constructor constructor = consumer.getConstructor();Constructor declaredConstructor = consumer.getDeclaredConstructor();// consumer.getConstructor(对应构造函数的参数列表);比如说String可以使用String.class
// consumer.getDeclaredConstructor(对应构造函数的参数列表);比如说int,可以使用int.class
Class consumer = Class.forName("Consumer");Constructor constructor = consumer.getConstructor(String.class);System.out.println(constructor.getModifiers());//获取对应构造函数的权限修饰符
上面的方法可以获取对应构造方法的权限修饰符。但是其是以整数的形式表示出来的:
1024:Abstract
16:Final
512:Interface
256:native
2:private
4:protected
1:public
8:static
2048:strict
32:synchronized
128:transient
64:volatile
Class consumer = Class.forName("Consumer");Constructor constructor = consumer.getConstructor(String.class);System.out.println(constructor.getParameterCount());//获取所需的参数个数Parameter[] parameters = constructor.getParameters();for (Parameter parameter : parameters) {System.out.println(parameter);}//获取所需的参数类型
Class consumer = Class.forName("Consumer");Constructor declaredConstructor = consumer.getDeclaredConstructor(String.class);//获取私有构造方法declaredConstructor.setAccessible(true);//临时取消私有的权限修饰declaredConstructor.newInstance("张三");//使用私有构造方法创建对象实例
获取成员变量
Class类中的用于获取成员变量的方法
方法 | 作用 |
---|---|
Field[] getFields() | 返回所有公共的成员变量对象的数组 |
Field[] getDeclaredFields() | 返回所有成员变量对象的数组 |
Field getField(String name) | 返回单个公共成员变量的对象 |
Field getDeclaredField(String name) | 返回单个成员变量的对象 |
Field类中用于创建对象的方法
方法 | 作用 |
---|---|
void set(Object o,Object value) | 赋值 |
Object get(Object obj) | 获取值 |
也可以获取权限修饰符,还可以获取字段类型
也可以暂时修改权限修饰符,然后可以进行get、set方法
获取成员方法
getMethods获取的方法包含父类中的方法
Declared不可以获取父类的,但是可以获取私有的
反射可以结合配置文件动态的创建对象调用方法。
动态代理
动态代理可以无侵入式的为方法增加功能
对象有什么方法想被代理,代理就一定要有对应的方法
通常要被代理的方法都放在接口中,两个类都实现这个接口
Java.lang.reflect.Proxy类:提供了为对象产生代理对象的方法:
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
参数一:用于指定使用哪一个类加载器,去加载生成的代理类
参数二:指定接口,这些接口用于指定生成的代理有什么方法
参数三:用于指定生成的代理对象要干什么事情
下面是一个示例:
方法类:
public class BigStar implements modefier {String name;public BigStar() {}public BigStar(String name) {this.name = name;}@Overridepublic String Sing(String songName) {System.out.println(this.name + "正在唱" + songName);return "谢谢大家\n";}@Overridepublic String Dance(String danceName) {System.out.println(this.name + "正在唱" + danceName);return "谢谢大家\n";}/*** 获取** @return name*/public String getName() {return name;}/*** 设置** @param name*/public void setName(String name) {this.name = name;}public String toString() {return "BigStar{name = " + name + "}";}
}
接口:(写想要被代理的方法)
public interface modefier {public abstract String Sing(String name);public abstract String Dance(String name);
}
代理类:
其中要判断执行为方法附加的功能
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class proxyUtil {public static modefier CreatProxy(BigStar bs) {modefier o = (modefier) Proxy.newProxyInstance(proxyUtil.class.getClassLoader(),new Class[]{modefier.class},new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if ("Sing".equals(method.getName())) {System.out.println("唱歌先收钱");} else if ("Dance".equals(method.getName())) {System.out.println("跳舞也要收钱");}return method.invoke(bs, args);}});return o;}
}
测试类:
BigStar bs = new BigStar("cxk");modefier modefier = proxyUtil.CreatProxy(bs);System.out.println(modefier.Sing("只因你太美"));
相关文章:

Java反射和动态代理
反射 反射允许对封装类的成员变量、成员方法和构造方法的信息进行编程访问 成员变量:修饰符、名字、类型、get/set值 构造方法:修饰符、名字、形参、创建对象 成员方法:修饰符、名字、形参、返回值、抛出的异常、获取注解、运行方法 获取…...
[NOIP2004 提高组] 津津的储蓄计划(思路+代码详解)Python实现
题目描述 津津的零花钱一直都是自己管理。每个月的月初妈妈给津津300 元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。 为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年…...

分布式搜索引擎es 面试突击
es elastocsearch 倒排索引是在数据查询之前建立,在查询的时候可以直接通过关键词定位到文档内容。用空间换时间 分布式架构原理说一下? es底层是基于lucene来的 大概就是一个用于全文检索的jar包 用es来做分布式的搜索引擎 可以承载一秒钟几千的…...
社会心理学的六个经典实验
社会心理学的六个经典实验 社会心理学(Social Psychology)是一门研究我们周围情境的力量的科学,尤其关注我们是如何看待他人,如何影响他人的。更确切地说,社会心理学是一门就人们如何看待他人,如何影响他人…...
Java 单例模式详解
单例模式(Singleton Pattern)是一种常见的设计模式,它可以确保某个类只有一个实例,并提供对该实例的全局访问点。本文将详细介绍 Java 中所有单例模式实现,包括懒汉式、饿汉式、枚举式、双重检查锁定式、静态内部类式等…...

AI读心重磅突破登Nature!大脑信号1秒被看穿,还能预测未来画面
最近,来自洛桑联邦理工学院的研究团队提出了一种全新的方法,可以用AI从大脑信号中提取视频画面。论文已登Nature,却遭网友疯狂「打假」。 现在,AI不仅会读脑,还会预测下一个画面了! 利用AI,一个…...

【SAP Abap】X-DOC:SNRO - ABAP流水号应用
【SAP Abap】X-DOC:SNRO - ABAP流水号应用 1、定义表(字段域)2、定义流水号3、使用流水号4、测试程序 1、定义表(字段域) 2、定义流水号 Tcode: SNRO/SNUM, 根据以上创建的字段域 YDSNRO,创建对…...

基于AT89C51单片机的交通灯设计与仿真
点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87763760?spm1001.2014.3001.5503 源码获取 主要内容: 设计一个能够控制十二盏交通信号灯的模拟系统,:利用单片机的定时器定时,令十字路口…...
MySQL系列三(定位慢SQL、SQL优化与索引优化)Using filesort
文章目录 1. 慢SQL1.1 定位慢SQL(慢查询日志)1.2 慢SQL优化整体思路 2. 索引优化3. SQL语句优化回表Using filesort 1. 慢SQL 1.1 定位慢SQL(慢查询日志) 在mysql 配置文件中 (my.conf),进行下面配置&…...

免费使用GPT-4.0?【AI聊天 | GPT4教学】 —— 微软 New Bing GPT4 申请与使用保姆级教程
目录 认识 New Bing 2. 注册并登录 Microsoft 账号 3. 如何免科学上网使用 New Bing? 4. 加入 WaitList 候补名单 5. 使用 New Bing! 6. 使用 Skype 免科学上网访问 New Bing! 7. 在 Chrome 浏览器中使用 New Bing! 8. 总…...

渲染对电脑伤害大吗_如何减少渲染伤机?
虽然说摄影穷三代,但想要自己的本地配置跟上自己的创作速度,高昂的硬件配置支出也可以让自己穷一段时间。CG制作过程中,渲染是必不可少的一步,而且这一步也是很吃“机器”的,那很多人也会担心,如果经常用自…...
非线性最小二乘
非线性最小二乘 目录 文章目录 非线性最小二乘目录 [toc]1 非线性最小二乘估计3 非线性最小二乘的实现 1 非线性最小二乘估计 在经典最小二乘法估计中,假定被解释变量的条件期望是关于参数的线性函数,例如 E ( y ∣ x ) a b x E(y|x) abx E(y∣x)a…...

23.5.7总结(学习通项目思路)
项目: 1.登录修改:删除数据库中的状态,通过使用 ConcurrentHashMap来作为是否在线的判断,通过设定一个退出的按钮,发消息给服务端主动移除对应的值。 2.注册:增加了手机号的填写,正则判断&…...

如何生成api接口获取宝贝商品详情,商品详情接口,产品详情
API (Application Programming Interface)是指应用程序接口,它是一种通过编写一组统一的规则,开发一个软件来与其他应用程序进行通讯的技术。API可以方便应用程序之间的交流和数据共享,以及增强应用程序的功能。 在现代应用程序中࿰…...

微服务---Redis实用篇-黑马头条项目-登录功能(短信验证缓存,用户信息缓存)
黑马头条项目-登录功能(短信验证缓存,用户信息缓存) 1、短信登录 1.1、导入黑马点评项目 1.1.1 、导入SQL 1.1.2、有关当前模型 手机或者app端发起请求,请求我们的nginx服务器,nginx基于七层模型走的事HTTP协议,可以实现基于Lua直接绕开t…...

美国纽扣电池的包装电池盒必须附带警告标签16 CFR 第 1700.20
美国纽扣电池及硬币电池的包装、电池盒必须附带警告标签16 CFR 第 1700.20 美国要求在纽扣电池或硬币电池的包装上、电池盒上以及包含纽扣电池或硬币电池的消费品附带说明和手册上贴上警告标签。 商品法规、标准和要求纽扣电池和硬币电池以下所有项: 16 CFR 第 17…...

AcWing——方格迷宫(有点不一样的迷宫问题)
4943. 方格迷宫 - AcWing题库 1、题目 给定一个 n 行 m 列的方格矩阵。 行从上到下依次编号为 1∼n,列从左到右依次编号为 1∼m。 第 i 行第 j 列的方格表示为 (i,j)。 矩阵中的方格要么是空地(用 . 表示),要么是陷阱…...

《常规脉搏传输时间作为人体血压变化标志》阅读笔记
目录 一、论文摘要 二、论文十问 Q1: 论文试图解决什么问题? Q2: 这是否是一个新的问题? Q3: 这篇文章要验证一个什么科学假设? Q4: 有哪些相关研究?如何归类?谁是这一课题在领域内值得关注的研究员? …...

java学习之异常三
目录 一、throws 一、基本说明 二、使用细节 二、自定义异常 一、 基本概念 编辑二、自定义异常的步骤 三、实例 四、练习 三、throw和throws的区别 四、本章作业 第一道 第二题 第三题 第四题 一、throws 一、基本说明 package com.hspedu.throws_;import java.i…...
生产者向 Kafka 发送消息的执行流程
(1)生产者要往 Kafka 发送消息时,需要创建 ProducerRecoder,代码如下: ProducerRecord<String,String> record new ProducerRecoder<>("CostomerCountry","Precision Products","Fr…...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...