Java反射(三) --- 动态代理

文章目录

  • 一、注意点
    • 1.获取Class实例的三种常见方式
    • 2.对Class类的理解
    • 3.创建Class对应运行时类的对象的通用方法,代码实现。以及这样操作,需要对应的运行时类构造器方面满足的要求
  • 二、静态代理举例
    • 代码
  • 三、动态代理举例


提示:以下是本篇文章正文内容,下面案例可供参考

一、注意点

1.获取Class实例的三种常见方式

Class clazz1 = String.class;Class clazz2 = person.getClass(); //sout(person); //xxx.yyy.zzz.Person@...Class clazz3 = Class.forName(String classPath);//体现反射的动态性

2.对Class类的理解

Class实例对应着加载到内存中的一个运行时类。

3.创建Class对应运行时类的对象的通用方法,代码实现。以及这样操作,需要对应的运行时类构造器方面满足的要求

Object obj = clazz.newInstance();//创建了对应的运行时类的对象

1.必须有空参的构造器
2.权限修饰符的权限要够。通常设置为public

二、静态代理举例

代码

package com.tyust.edu;/*** 静态代理举例* 特点:代理类和被代理类在编译期间,就确定下来了* @author YML TYUST-XDU 2019-2026* @create 2023-10-09 8:02*/
interface ClothFactory{void produceCloth();
}//代理类
class ProxyClothFactory implements ClothFactory{private ClothFactory factory;//用被代理类对象进行实例化public ProxyClothFactory(ClothFactory factory){this.factory = factory;}public void produceCloth() {System.out.println("代理工厂做一些准备工作");factory.produceCloth();System.out.println("代理工厂做一些后续的收尾工作");}
}//被代理类
class NikeClothFactory implements ClothFactory{public void produceCloth() {System.out.println("Nike工厂生产一批运动服");}
}public class StaticProxyTest {public static void main(String[] args) {//创建被代理类的对象ClothFactory nike = new NikeClothFactory();//创建代理类的对象ClothFactory proxyClothFactory = new ProxyClothFactory(nike);proxyClothFactory.produceCloth();}
}

三、动态代理举例

代码如下(示例):

package com.tyust.edu;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;/*** 动态代理的举例* @author YML TYUST-XDU 2019-2026* @create 2023-10-09 7:56*/
interface Human{String getBelief();void eat(String food);
}//被代理类
class SuperMan implements Human{public String getBelief() {return "I believe I can fly!";}public void eat(String food) {System.out.println("我喜欢吃"+ food);}
}class ProxyFactory{public static Object getProxyInstance(Object obj){MyInvocationHandler handler = new MyInvocationHandler();handler.bind(obj);return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),handler);}
}
class MyInvocationHandler implements InvocationHandler{private Object obj;//需要用被代理类的对象进行赋值public void bind(Object obj){this.obj = obj;}//当我们通过代理类的对象,调用方法a时,就会自动的调用如下的方法: invoke()//将被代理类要执行的方法a的功能就声明在invoke()中@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//method: 即为代理类对象调用的方法,此方法也就作为了被代理类对象要调用的方法//obj:被代理类的对象Object returnValue = method.invoke(obj,args);上述方法的返回值就作为当前类中的invoke()的返回值return returnValue;}
}public class ProxyTest {public static void main(String[] args) {SuperMan superMan = new SuperMan();//proxyInstance:代理类的对象Human proxyInstance = (Human)ProxyFactory.getProxyInstance(superMan);//当通过代理类对象调用方法时,会自动的调用被代理类中同名的方法String belief = proxyInstance.getBelief();System.out.println(belief);proxyInstance.eat( "四川麻辣烫");System.out.println("*********************************");NikeClothFactory nikeClothFactory = new NikeClothFactory();ClothFactory proxyClothFactory = (ClothFactory) ProxyFactory.getProxyInstance(nikeClothFactory);proxyClothFactory.produceCloth();}}

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

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

相关文章

Spring Boot:自定义注解--annotation

目录 自定义注解的定义和作用范围如何创建自定义注解创建注解接口 如何使用自定义注解进行数据验证创建注解处理器控制器中使用注解 如何为字段添加注解 自定义注解的定义和作用范围 自定义注解可以作用在类、方法、属性、参数、异常、字段或其他注解上。 如何创建自定义注解…

Google AdSense 账户开通网站广告位后如何配置付款电汇账号的详细教程!

本篇文章主要讲解:Google AdSense 账户开通网站广告位后如何配置付款电汇账号的详细教程。通过本文章可以快速了解开通账户配置权限的整体流程,很多小白朋友注册完毕后发现根本没有配置账号的入口,这篇文章能够告诉你详细的原有。 日期&#…

知识增强语言模型提示 零样本知识图谱问答10.8+10.11

知识增强语言模型提示 零样本知识图谱问答 摘要介绍相关工作方法零样本QA的LM提示知识增强的LM提示与知识问题相关的知识检索 实验设置数据集大型语言模型基线模型和KAPIN评估指标实现细节 实验结果和分析结论 摘要 大型语言模型(LLM)能够执行 零样本cl…

CAN和CANFD通信介绍

CAN(Controller Area Network,控制器局域网)是一种串行通信技术,专门用于在汽车电子控制单元(ECU)之间实现可靠的数据交换。 CAN协议介绍 电子化 汽车近年来的发展呈现出以电子化为主的特点。电子化的主…

Lab 1: Unix utilities汇总

这个实验主要学习了常用的一些系统调用。 Lab 1: Unix utilities Boot xv6 (easy) git克隆,切换分支,qemu。根据要求进行操作即可。 $ git clone git://g.csail.mit.edu/xv6-labs-2020 $ cd xv6-labs-2020 $ git checkout util $ make qemusleep (ea…

数据中心供配电及能效管理系统的设计要点

摘要:现代的数据中心中都包括大量的计算机,对于这种场所的电力供应,都要求供电系统需要在所有的时间都有效,这就不同于一般建筑的供配电系统,它是一个交叉的系统,涉及到市电供电、防雷接地、防静电、UPS不间…

分类预测 | MATLAB实现KOA-CNN-BiGRU开普勒算法优化卷积双向门控循环单元数据分类预测

分类预测 | MATLAB实现KOA-CNN-BiGRU开普勒算法优化卷积双向门控循环单元数据分类预测 目录 分类预测 | MATLAB实现KOA-CNN-BiGRU开普勒算法优化卷积双向门控循环单元数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现KOA-CNN-BiGRU开普勒算法优化…

Visual Studio 2022新建项目时没有ASP.NET项目

一、Visual Studio 2022新建项目时没有ASP.NET项目 1、打开VS开发工具,选择工具菜单,点击“获取工具和功能” 2、选择“ASP.NET和Web开发”和把其他项目模板(早期版本)勾选上安装即可

ICPC 2019-2020 North-Western Russia Regional Contest

A (codeforces.com) 这题在移动不被挡板挡住以及不超过边界的情况下,每次走的越多那么次数就越少 只要两个每次都走b-a步(已经是不被挡板挡住走的最多了),就不用考虑被挡板挡住的情况,只用单独考虑了,如果…

2023年陕西省安全员B证证考试题库及陕西省安全员B证试题解析

题库来源:安全生产模拟考试一点通公众号小程序 2023年陕西省安全员B证证考试题库及陕西省安全员B证试题解析是安全生产模拟考试一点通结合(安监局)特种作业人员操作证考试大纲和(质检局)特种设备作业人员上岗证考试大…

ArcGIS/GeoScene脚本:基于粒子群优化的支持向量机分类模型

参数输入 输出 栅格 预测为负类的概率 预测为正类的概率 二值化结果 评估结果 ROC曲线

【2023.10版本】linux安装cuda和cudnn【已经解决】

别再百度了,都是错,都是版本不对的回答,官网教程才是解决王道。 cuda: 1. Introduction — cuda-installation-guide-linux 12.2 documentation (nvidia.com) cudnn Installation Guide - NVIDIA Docs 有哪些方法,上面说的非…

PageHelper详解

这里有两个参数,分别为:page1,rows20。默认请求第一页,每页显示20条数据 先PageHelper.startPage(1, 10)开始分页,再selectlist查询数据库的时候会自动加上limit 1,10。 得到这样的结果:查询结…

kepler.gl 笔记:Layer

Point S2Layer Icon Line Cluster Polygon 一个路径型的GeoJSON图层可以显示诸如行程路线或等值线的数据。轮廓的颜色可以使用数值字段进行设置。 一个多边形型的GeoJSON图层本质上是一种区域填充图层,最适合用于呈现地理围栏。填充颜色或高度可以使用数值字…

LLVM(5)ORC实例分析

ORC实例总结 总结 因为API茫茫多,逻辑上的一些概念需要搞清,编码时会容易很多。JIT的运行实体使用LLVMOrcCreateLLJIT可以创建出来,逻辑上的JIT实例。JIT实例需要加入运行库(依赖库)和用户定义的context(…

多线程并发篇---第四篇

系列文章目录 文章目录 系列文章目录一、Java中synchronized 和 ReentrantLock 有什么不同?二、有三个线程T1,T2,T3,如何保证顺序执行?三、SynchronizedMap和ConcurrentHashMap有什么区别?一、Java中synchronized 和 ReentrantLock 有什么不同? 相似点: 这两种同步方式有…

Qt 关于mouseTracking鼠标追踪和tabletTracking平板追踪的几点官方说明

mouseTracking属性用于保存是否启用鼠标跟踪,缺省情况是不启用的。 没启用的情况下,对应部件只接收在鼠标移动同时至少一个鼠标按键按下时的鼠标移动事件。 启用鼠标跟踪的情况下,任何鼠标移动事件部件都会接收。 部件方法hasMouseTrackin…

设计模式 - 状态模式

目录 一. 前言 二. 实现 一. 前言 状态模式(State Pattern):它主要用来解决对象在多种状态转换时,需要对外输出不同的行为的问题。状态和行为是一一对应的,状态之间可以相互转换。当一个对象的内在状态改变时&#x…

点击、拖曳,15分钟搞定BI零售数据分析

早几年做数据分析还很依赖IT,过程复杂、耗时长、灵活性差,但这几年随着BI智能数据分析技术的成长,零售数据分析发生了翻天覆地的变化,其中最直观的一点就是:点击、拖曳,15分钟内就能搞定BI零售数据分析。 …

批量给每一段文字 段落加上符号

批量给每一段文字 段落加上符号 例如 要给下面的内容统一加上[xxxxxxxx] 查找替换–>查找内容 :输入前面统一的标识 替换为:–>特殊格式–>查找内容–>全部替换 先在前面加符号 在后面加符号: 最后效果: