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

Java反射和动态代理

反射

反射允许对封装类的成员变量、成员方法和构造方法的信息进行编程访问

成员变量:修饰符、名字、类型、get/set值

构造方法:修饰符、名字、形参、创建对象

成员方法:修饰符、名字、形参、返回值、抛出的异常、获取注解、运行方法

获取class对象

  1. Class.forName(“全类名”);全类名是包名加类名
  2. 类名.class
  3. 对象.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反射和动态代理

反射 反射允许对封装类的成员变量、成员方法和构造方法的信息进行编程访问 成员变量&#xff1a;修饰符、名字、类型、get/set值 构造方法&#xff1a;修饰符、名字、形参、创建对象 成员方法&#xff1a;修饰符、名字、形参、返回值、抛出的异常、获取注解、运行方法 获取…...

[NOIP2004 提高组] 津津的储蓄计划(思路+代码详解)Python实现

题目描述 津津的零花钱一直都是自己管理。每个月的月初妈妈给津津300 元钱&#xff0c;津津会预算这个月的花销&#xff0c;并且总能做到实际花销和预算的相同。 为了让津津学习如何储蓄&#xff0c;妈妈提出&#xff0c;津津可以随时把整百的钱存在她那里&#xff0c;到了年…...

分布式搜索引擎es 面试突击

es elastocsearch 倒排索引是在数据查询之前建立&#xff0c;在查询的时候可以直接通过关键词定位到文档内容。用空间换时间 分布式架构原理说一下&#xff1f; es底层是基于lucene来的 大概就是一个用于全文检索的jar包 用es来做分布式的搜索引擎 可以承载一秒钟几千的…...

社会心理学的六个经典实验

社会心理学的六个经典实验 社会心理学&#xff08;Social Psychology&#xff09;是一门研究我们周围情境的力量的科学&#xff0c;尤其关注我们是如何看待他人&#xff0c;如何影响他人的。更确切地说&#xff0c;社会心理学是一门就人们如何看待他人&#xff0c;如何影响他人…...

Java 单例模式详解

单例模式&#xff08;Singleton Pattern&#xff09;是一种常见的设计模式&#xff0c;它可以确保某个类只有一个实例&#xff0c;并提供对该实例的全局访问点。本文将详细介绍 Java 中所有单例模式实现&#xff0c;包括懒汉式、饿汉式、枚举式、双重检查锁定式、静态内部类式等…...

AI读心重磅突破登Nature!大脑信号1秒被看穿,还能预测未来画面

最近&#xff0c;来自洛桑联邦理工学院的研究团队提出了一种全新的方法&#xff0c;可以用AI从大脑信号中提取视频画面。论文已登Nature&#xff0c;却遭网友疯狂「打假」。 现在&#xff0c;AI不仅会读脑&#xff0c;还会预测下一个画面了&#xff01; 利用AI&#xff0c;一个…...

【SAP Abap】X-DOC:SNRO - ABAP流水号应用

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

基于AT89C51单片机的交通灯设计与仿真

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/87763760?spm1001.2014.3001.5503 源码获取 主要内容&#xff1a; 设计一个能够控制十二盏交通信号灯的模拟系统,:利用单片机的定时器定时&#xff0c;令十字路口…...

MySQL系列三(定位慢SQL、SQL优化与索引优化)Using filesort

文章目录 1. 慢SQL1.1 定位慢SQL&#xff08;慢查询日志&#xff09;1.2 慢SQL优化整体思路 2. 索引优化3. SQL语句优化回表Using filesort 1. 慢SQL 1.1 定位慢SQL&#xff08;慢查询日志&#xff09; 在mysql 配置文件中 &#xff08;my.conf)&#xff0c;进行下面配置&…...

免费使用GPT-4.0?【AI聊天 | GPT4教学】 —— 微软 New Bing GPT4 申请与使用保姆级教程

目录 认识 New Bing 2. 注册并登录 Microsoft 账号 3. 如何免科学上网使用 New Bing&#xff1f; 4. 加入 WaitList 候补名单 5. 使用 New Bing&#xff01; 6. 使用 Skype 免科学上网访问 New Bing&#xff01; 7. 在 Chrome 浏览器中使用 New Bing&#xff01; 8. 总…...

渲染对电脑伤害大吗_如何减少渲染伤机?

虽然说摄影穷三代&#xff0c;但想要自己的本地配置跟上自己的创作速度&#xff0c;高昂的硬件配置支出也可以让自己穷一段时间。CG制作过程中&#xff0c;渲染是必不可少的一步&#xff0c;而且这一步也是很吃“机器”的&#xff0c;那很多人也会担心&#xff0c;如果经常用自…...

非线性最小二乘

非线性最小二乘 目录 文章目录 非线性最小二乘目录 [toc]1 非线性最小二乘估计3 非线性最小二乘的实现 1 非线性最小二乘估计 在经典最小二乘法估计中&#xff0c;假定被解释变量的条件期望是关于参数的线性函数&#xff0c;例如 E ( y ∣ x ) a b x E(y|x) abx E(y∣x)a…...

23.5.7总结(学习通项目思路)

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

如何生成api接口获取宝贝商品详情,商品详情接口,产品详情

API (Application Programming Interface)是指应用程序接口&#xff0c;它是一种通过编写一组统一的规则&#xff0c;开发一个软件来与其他应用程序进行通讯的技术。API可以方便应用程序之间的交流和数据共享&#xff0c;以及增强应用程序的功能。 在现代应用程序中&#xff0…...

微服务---Redis实用篇-黑马头条项目-登录功能(短信验证缓存,用户信息缓存)

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

美国纽扣电池的包装电池盒必须附带警告标签16 CFR 第 1700.20

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

AcWing——方格迷宫(有点不一样的迷宫问题)

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

《常规脉搏传输时间作为人体血压变化标志》阅读笔记

目录 一、论文摘要 二、论文十问 Q1: 论文试图解决什么问题&#xff1f; Q2: 这是否是一个新的问题&#xff1f; Q3: 这篇文章要验证一个什么科学假设&#xff1f; Q4: 有哪些相关研究&#xff1f;如何归类&#xff1f;谁是这一课题在领域内值得关注的研究员&#xff1f; …...

java学习之异常三

目录 一、throws 一、基本说明 二、使用细节 二、自定义异常 一、 基本概念 ​编辑二、自定义异常的步骤 三、实例 四、练习 三、throw和throws的区别 四、本章作业 第一道 第二题 第三题 第四题 一、throws 一、基本说明 package com.hspedu.throws_;import java.i…...

生产者向 Kafka 发送消息的执行流程

&#xff08;1&#xff09;生产者要往 Kafka 发送消息时&#xff0c;需要创建 ProducerRecoder,代码如下&#xff1a; ProducerRecord<String,String> record new ProducerRecoder<>("CostomerCountry","Precision Products","Fr…...

Linux命令·netstat

netstat命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据&#xff0c;一般用于检验本机各端口的网络连接情况。netstat是在内核中访问网络及相关信息的程序&#xff0c;它能提供TCP连接&#xff0c;TCP和UDP监听&#xff0c;进程内存管理的相关报告。 如果你的计算机有时候…...

《心安即是归处》读书笔记

目录 作者简介 经典摘录 一个人活在世界上&#xff0c;必须处理好三个关系 什么叫人生呢&#xff1f; 谈一下人性的问题 了解人生的意义与价值 人生之美 评断一本书的好与坏有什么标准呢&#xff1f; 知足知不足 作者简介 季羡林&#xff0c;随便查询一下作者简介&…...

C++:使用红黑树封装map和set

目录 一. 如何使用一颗红黑树同时实现map和set 二. 红黑树的节点插入操作 三. 红黑树迭代器的实现 3.1 begin()和end() 3.2 operator和operator-- 3.3 红黑树迭代器实现完整版代码 四. map和set的封装 附录&#xff1a;用红黑树封装map和set完整版代码 1. RBTree.h文件…...

Go 命令

目录 文章目录 go buildgo cleango fmtgo getgo installgo testgo toolgo generategodoc其它命令 go build 这个命令主要用于编译代码。在包的编译过程中&#xff0c;若有必要&#xff0c;会同时编译与之相关联的包。 如果是普通包&#xff0c;就像我们在1.2节中编写的mymath包…...

LEO、HW、LSO、LW 分别代表什么?

LEO &#xff1a;是 LogEndOffset 的简称&#xff0c;代表当前日志文件中下一条。HW&#xff1a;水位或水印一词&#xff0c;也可称为高水位 &#xff08;high watermark&#xff09; ,通常被用在流式处理领域 &#xff08;flink、spark&#xff09; &#xff0c;以表征元素…...

问题 B: 跳石头(C++)(二分答案)

目录 1.题目描述 2.AC 1.题目描述 问题 B: 跳石头 时间限制: 1.000 Sec 内存限制: 128 MB提交 状态 题目描述 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点…...

bugku——变量1

拿到题目后是一串PHP代码&#xff0c;给到提示是flag在变量中&#xff0c;接下来进行代码审计 error_reporting(0)&#xff1a;关闭错误报告 include “flag1.php”:包含flag1.php文件 highlight_file(_file_)&#xff1a;页面进行语法高亮显示 isset($_GET[‘args’])&#xf…...

网络数据包丢失监控

什么是网络数据包 数据包或网络数据包是通过网络传输的小数据单元。顾名思义&#xff0c;这些是小的、离散的数据单元。单独来看&#xff0c;这些单位不一定有多大意义。它们只是正在传输的整体消息的一部分&#xff0c;这些消息已被组装成多个层。但是&#xff0c;当组合在一…...

Linux服务器安装部署MongoDB数据库 - 无公网IP远程连接

目录 前言 1. 配置Mongodb源 2. 安装MongoDB 3. 局域网连接测试 4. 安装cpolar内网穿透 5. 配置公网访问地址 6. 公网远程连接 7. 固定连接公网地址 8. 使用固定地址连接 转载自Cpolar Lisa文章&#xff1a;Linux服务器安装部署MongoDB数据库 - 无公网IP远程连接「内网…...

CSS面试题:30道含答案和代码示例的练习题

什么是 CSS&#xff1f;它的作用是什么&#xff1f; CSS&#xff08;层叠样式表&#xff09;是一种用于描述网页样式的语言。它的作用是控制网页的布局、字体、颜色、背景等方面的样式。如何在 HTML 页面中引入 CSS&#xff1f; 可以使用 标签将 CSS 文件引入到 HTML 页面中。例…...