Java中如何实现动态代理

2023-11-10

        想要实现Java中的动态代理首先应,动态生成接口实现类。

        interface 接口不能实例化,但是 interface 类型的引用,可以指向任何一个实现类对象实例。但前提是,在编译期必须存在该接口的实现类。

        如果在编译期无法编写或提供实现类,而是希望在运行期,动态的创建某个 interface 接口的实现类对象实例,就需要使用 Java 标准库提供的一种叫动态代理( Dynamic Proxy )的机制。 动态代理( Dynamic Proxy ): 可以在运行期,动态创建某个 interface 的实例。所谓动态,是和静态相对应的。

在运行期,通过动态代理创建一个 interface 实例的过程如下:

1. 定义一个 InvocationHandler 实例,它负责实现接口的方法调用;

2. 通过 Proxy.newProxyInstance() 创建 interface 实例,它需 3个参数:

a. 使用的 ClassLoader ,通常就是接口类的 ClassLoader ;

b. 需要实现的接口数组,至少需要传入一个接口进去;

c. 用来处理接口方法调用的 InvocationHandler 实例。

代理模式

代理模式:给某一个对象提供一个代理,并由代理对象来控制对真实对象的访问。代理模式是一种结构型设计模式。 代理模式角色分为3 种:

Subject(抽象主题角色):定义代理类和真实主题的公共对外方法。通常被设计成接口。

RealSubject(真实主题角色):真正实现业务逻辑的类;

Proxy(代理主题角色):用来代理和封装真实主题;       

 JDK动态代理主要涉及两个类: java.lang.reflect.Proxy 和 java.lang.reflect.InvocationHandler 。我们通过编写一个调用逻辑 处理器 LogHandler 类案例来提供日志增强功能,并实现 InvocationHandler 接口;在 LogHandler 中维护一个目标对象,这个对象是被代理 的对象(真实主题角色);在 invoke() 方法中编写方法调用的逻辑处理。

以下是Pxory代码 用来代理和封装真实主题

package com.my.hyz5;

import java.lang.reflect.Proxy;

public class Client {
	public static void main(String[] args) {
		
		ClassLoader loader = OrderService1.class.getClassLoader();
		Class[] interfaces = {OrderService1.class};
		LoadHandler lh = new LoadHandler(new OrderServiceimpl());
		OrderService1 os = (OrderService1)Proxy.newProxyInstance(loader, interfaces, lh);
		os.update();
		
	}
}

以下是Subject代码抽象主体公共代码

package com.my.hyz5;

public interface OrderService1 {
	void update();
	void select();
}

以下是real Subject 真正实现逻辑的代码

package com.my.hyz5;

public class OrderServiceimpl implements OrderService1 {
	public static void main(String[] args) {
		
	}

	@Override
	public void update() {
		System.out.println("开始更新update啦");
	}

	@Override
	public void select() {
		System.out.println("开始select啦");
	}
}

以下是 InvocationHandler 实例的代码

package com.my.hyz5;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.time.LocalDateTime;

public class LoadHandler implements InvocationHandler {
	Object target;
	public LoadHandler(Object target) {
		this.target=target;
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.printf("%s方法开始\n",method.getName());
		Object result = method.invoke(target, args);
		//System.out.println("方法"+method.getName()+"开始啦");
		System.out.println("方法"+method.getName() +LocalDateTime.now()+"结束啦");
		return null;
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java中如何实现动态代理 的相关文章

随机推荐

  • aso优化师是什么_aso是什么意思 aso优化师是啥

    aso是什么意思 aso优化师是啥 年已过完 要收心工作学习了 今天李鑫自媒体就从头过滤一下aso方面的知识 用文字总结表述出来 加深自己理解的同时也帮助一些新手小伙伴了解aso aso是什么意思 ASO是App store Optimiz
  • element 的 this.$message( ) 消息提示实现

    在vue项目中 直接通过js代码 this message 就可以调出消息提示组件 这是如何实现的呢 主要分为以下几步 1 用 Vue extend 创建组件的模板 构造函数 2 创建一个函数 在函数内部 实例化组件并进行挂载到相应元素上
  • 【开发记录01】开发环境副本/页的导入&带用户权限管理系统

    在蒋老师的指导下大概了解了 1 开发环境的数据导入 导出 共享组件的同步 因为应用程序277是应用程序100的子程序 所以共享组件必须和100保持一致 但是会出现一个小问题 在APEX开发过程中同时打开两个不同的应用程序 但是编辑过程中经常
  • CVE-2017-12149

    春秋云镜 CVE 2017 12149 JBoss反序列化漏洞 靶标介绍 2017年8月30日 厂商Redhat发布了一个JBOSSAS 5 x 的反序列化远程代码执行漏洞通告 该漏洞位于JBoss的HttpInvoker组件中的 Read
  • 【教程】Github快速学习

    教程 Github快速学习 备注 一 Git基础 1 安装 2 git原理 3 基本配置 4 Gitignore 二 Git分支 1 基础命令 三 学习Github Github Docs官方文档 gt Github漫游指南 gt 开源指北
  • 毕业设计-基于大数据技术的旅游推荐系统-python

    目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生级别难度
  • 大数据常用采集工具

    1 Flume Flume作为Hadoop的组件 是由Cloudera专门研发的分布式日志收集系统 尤其近几年随着Flume的不断完善 用户在开发过程中使用的便利性得到很大的改善 Flume现已成为Apache Top项目之一 Flume提
  • [转]一文读懂PID控制算法(抛弃公式,从原理上真正理解PID控制)

    一文读懂PID控制算法 抛弃公式 从原理上真正理解PID控制 PID控制应该算是应用非常广泛的控制算法了 小到控制一个元件的温度 大到控制无人机的飞行姿态和飞行速度等等 都可以使用PID控制 这里我们从原理上来理解PID控制 PID pro
  • AcWing 1603. 整数集合划分

    给定一个包含 N 个正整数的集合 请你将它们划分为两个不相交的集合 A1 和 A2 其中 A1 包含 n1 个元素 A2 包含 n2 个元素 用 S1 表示集合 A1 内所有元素之和 S2 表示集合 A2 内所有元素之和 请你妥善划分 使得
  • 前端技术栈

    https juejin cn post 7036581158670303240 做了一份前端面试复习计划 保熟 掘金 1 Vue和React的区别 Vue和React的比较 布里渊区 CSDN博客 2 CI CD 做了哪些实践 什么是 C
  • LASlib 读写点云

    一 参考链接 1 LASlib LAStools 2 LASlib库将PCL库点云类型数据转换为las格式保存 3 las数据转 pcd并显示 las格式详解 1 孙爱怡 王健 LAS格式的解析与转换 J 全球定位系统 2016 41 02
  • 分布式搜索elasticsearch高级配置之(二)------线程池设置

    原文 http blog csdn net laigood article details 7943630 一个Elasticsearch节点会有多个线程池 但重要的是下面四个 索引 index 主要是索引数据和删除数据操作 默认是cach
  • Tensorrt下的Yolox部署

    这里写目录标题 一 Ubuntu系统的安装与显卡驱动安装 二 Tensorrt的安装 三 YOLOX的安装 四 torch2trt的安装 五 engine文件的准备 根据设备修改源文件 引擎生成 六 运行demo 先改一下CMakeList
  • 终于搞懂了,用大白话给你解释Zookeeper的选举机制,包教会

    号外号外 死磕 Java 并发编程 系列连载中 大家可以关注一波 死磕 Java 并发编程05 阿里面试失败后 一气之下我图解了Java中18把锁 死磕 Java 并发编程04 说说Java Atomic 原子类的实现原理 死磕 Java
  • Android导出aar时嵌套引用的那些坑

    http www jianshu com p 7a532de0b111 最近写了个Android SDK工程 在代码 测试统统完成后 居然在导出的一步折腾了两三天 在此总结下查找资料的过程和结果 引以借鉴 首先 这次趟坑解决了以下问题 导出
  • 替换word中手动换行(软回车)为段落标记(硬回车)

    在字处理软件中 由Enter键按下去导致一行文字换行的叫硬回车 程序自动换行的叫做软回车 软回车是用 Shift Enter 产生的 它换行 但是并不换段 即前后两段文字在 Word 中属于同一 段 word中遇到网页粘贴过来的内容会有大量
  • Unity背景移动特效

    每日一句 嘴角上扬的时候 任何事物都变得可爱起来了 第一步 确保所要滚动的图像 Wrap Made Repeat 第二步 画布下滚动图像使用 Raw Image组件 可以访问UV 第三步 创建脚本ScrollControl挂载在滚动图像上
  • 增强型pmos电路符号_MOS管:管脚判定与符号画法

    MOS管是我们在电路设计中经常用的一种无源器件 下面介绍下MOS管在原理图 PCB以及实物PCBA上如何辨别其各个管脚 方便调试 管脚判定 1 MOS管GSD在原理图和PCB上怎样判别 G极 gate 栅极 不用说比较好认 封装上左下角为G
  • 【EMC笔试题】N个整数中找出三个数,使其和的绝对值最小

    题目描述 给定包含N个数的无序数组S 可能包含负数 0 正数 求三个数A B C 使其和的绝对值最小 例如 S 9 0 1 3 6 A 9 B 3 C 6 MIN 0 算法解析 解法一 枚举3个数 O N N N 解法二 对S排序后枚举其中
  • Java中如何实现动态代理

    想要实现Java中的动态代理首先应 动态生成接口实现类 interface 接口不能实例化 但是 interface 类型的引用 可以指向任何一个实现类对象实例 但前提是 在编译期必须存在该接口的实现类 如果在编译期无法编写或提供实现类 而