【java学习—十四】java动态代理(6)

文章目录

  • 1. 相关概念
  • 2. 步骤
  • 3. 举例


问题:
假设一个java项目有100个java类,每个java有10个方法,这总共有1000个方法,现在有这样一个需求,需要在每个java方法加上2句话:在方法执行前输出这个方法开始执行;在方法执行后输出这个方法已经完成。这么多方法不可能在每个方法中一一实现
解决办法:动态代理

1. 相关概念

Proxy :专门完成代理的操作类,是所有动态代理类的父类。通过此类为一个或多个接口动态地生成实现类。

创建一个动态代理类所对应的 Class 对象:
    static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h):直接创建一个动态代理对象

2. 步骤

  1. 创建一个实现接口 InvocationHandler 的类,它必须实现 invoke方法,以完成代理的具体操作。
  2. 创建被代理的类以及接口
  3. 通过 Proxy 的静态方法newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) 创建一个 Subject 接口代理
  4. 通过 Subject 代理调用 RealSubject 实现类的方法

3. 举例

接口ITestDemo

package day14;

public interface ITestDemo {
	void test1();
	void test2();
}

类TestDemoImpl实现接口ITestDemo

package day14;

public class TestDemoImpl implements ITestDemo {

	@Override
	public void test1() {
		System.out.println("执行test1()方法");

	}

	@Override
	public void test2() {
		System.out.println("执行test2()方法");

	}

}

动态代理类ProxyDemo

package day14;

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

/**
 * 动态代理类
 * @author 14532
 *
 */
public class ProxyDemo implements InvocationHandler{
	
	Object obj;//被代理的对象
	
	public ProxyDemo(Object obj) {
		this.obj = obj;
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		
		System.out.println(method.getName() + "方法开始执行");
		
		Object result = method.invoke(this.obj, args);//执行的是指定代理对象的指定方法
		
		System.out.println(method.getName() + "方法执行完毕");
		
		return null;
	}
}

Test.java:

package day14;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class Test2 {
	public static void main(String[] args) {
		ITestDemo test = new TestDemoImpl();
		/**
		 * 注意:如果一个对象想要通过Proxy.newProxyInstance方法被代理
		 * 那么这个对象的类一定要有相应的接口
		 * 就像本类中的ITestDemo接口和实现类TestDemoImpl
		 */
		test.test1();
		test.test2();
		
		System.out.println("=============下面执行动态代理================");
		
		/**
		 * 需求:
		 * 在执行test1和test2方法时需要加入一些东西
		 * 在执行方法前打印test1或test2开始执行
		 * 在执行方法后打印test1或test2执行完毕
		 * 打印的方法名要和当时调用方法保持一致
		 */
		
		InvocationHandler handler = new ProxyDemo(test);
		
		/**
		 * Proxy.newProxyInstance(ClassLoader, interface, h)
		 * 参数1是代理对象的类加载器
		 * 参数2是被代理的对象的接口
		 * 参数3是代理对象
		 * 
		 * 返回的值就是成功被代理后的对象,返回的是Object类型,需要根据当时情况去转换类型
		 */
		ITestDemo t= (ITestDemo)Proxy.newProxyInstance(handler.getClass().getClassLoader(), test.getClass().getInterfaces(), handler);
		
		t.test1();
		System.out.println("----------------------------------");
		t.test2();
	}
}

运行结果:

在这里插入图片描述

注意:如果一个对象想要通过Proxy.newProxyInstance方法被代理,那么这个对象的类一定要有相应的接口,就像本类中的ITestDemo接口和实现类TestDemoImpl

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

App Inventor 2 如何比较两个日期/时间?

利用计时器组件的相关方法&#xff1a; 比较两个日期/时间对象的毫秒数&#xff0c;具体请参见文档&#xff1a;https://www.fun123.cn/reference/ ... tml#Clock.GetMillis

QT使用Socket与安卓Socket互发消息

背景:安卓设备通过usb网络共享给Linux,此时安卓设备与linux处于同一网络环境,符合使用socket的条件,linux做客户端,安卓做服务端 1.QT使用Socket (1).在工程文件中加入 QT network (2).导包以及写一些槽函数用做数据传输与状态接收 #ifndef MAINWINDOW_H #define MAINWINDOW…

利用自动化和条形码优化SAP制造供应链

背景 Welch Allyn 是全球领先的医疗诊断设备制造商&#xff0c;开发了数百种突破性产品和技术&#xff0c;使一线从业者能够提供卓越的患者护理。它拥有近 2,500 名员工&#xff0c;在 26 个不同的国家/地区工作。 挑战 提高运营效率 原因&#xff1a;用户需要长途跋涉并完成多…

【外汇天眼】解析外汇交易平台:深度了解DD与NDD两大模式

外汇交易平台种类繁多&#xff0c;涵盖不同的分类与运营模式&#xff0c;令投资者难以甄别&#xff0c;也增加了选择的难度。为了解决这一问题&#xff0c;我们将更深入地了解外汇平台的多样性。 在线外汇交易平台主要分为两大类&#xff1a;处理平台模式&#xff08;Dealing …

JSON vs. CSV vs. YAML vs. XML vs. HDF5vs. XLS:数据格式之争

前言 数据处理是现代计算机科学和信息技术中至关重要的一部分。有效地选择和处理数据格式是数据科学、工程和各种应用中的关键环节。本文将深入探讨各种常见数据格式及其Python库的应用&#xff0c;旨在帮助读者更好地理解和应用这些数据格式&#xff0c;以及如何选择最适合自…

PC6404降压调整器负载大高集成低纹波800mA大电流输出

PC6406是一款由基准电压源、振荡电路、比较器、PWM/PFM 控制电路等构成的CMOS降压DC/DC调整器。利用PWM/PFM自动切换控制电路达到可调占空比&#xff0c;具有全输入电压范围&#xff08;1.8&#xff0d;5.5V&#xff09;内的低纹波、高效率和大输出电流等特点。PC6406内置功率M…

C++: 模板初阶

文章目录 一. 泛型编程二. 函数模板函数模板的原理函数模板的实例化隐式实例化: 让编译器根据实参推演模板参数的实际类型显示实例化: 在函数名后的<>中制定模板参数的世纪类型 模板参数的匹配原则 三. 类模板类模板的定义格式类模板的实例化 一. 泛型编程 如何实现一个…

Python练习

Python 练习一练习二练习三 练习一 实现代码&#xff1a; def merge(list1, list2):merged_list []i 0j 0while i < len(list1) and j < len(list2):if list1[i] < list2[j]:merged_list.append(list1[i])i 1else:merged_list.append(list2[j])j 1merged_list …

为什么程序员一定要写单元测试?

大家好&#xff0c;我是鱼皮&#xff0c;很多初学编程的同学都会认为 “程序员的工作只有开发新功能&#xff0c;功能做完了就完事儿”。但其实不然&#xff0c;保证程序的正常运行、提高程序的稳定性和质量也是程序员的核心工作。 之前给大家分享过企业项目的完整开发流程&am…

分享一个在线免费制作和视频合成gif的网站

一、打开网站 在线制作高清gif动图-视频转gif表情工具-图片合成软件-gif.cn_GIF中文网 如图 二、可以选择gif合成&#xff0c;也就是把多张图片合成gif 效果图&#xff0c;我用了三张图片。 三、可以选择视频转gif。 效果图 四、完

RT-DETR算法优化改进:Backbone改进 | LSKNet:遥感旋转目标检测新SOTA | ICCV 2023

💡💡💡本文独家改进:LSKNet 助力RT-DETR ,替换backbone,Large Selective Kernel Network (LSKNet),可以动态地调整其大空间感受野,以更好地建模遥感场景中各种物体的测距的场景。 推荐指数:五星 RT-DETR魔术师专栏介绍: https://blog.csdn.net/m0_63774211/cat…

Git学习(黑马程序员)

基本配置 在用户目录下创建文件.bashrc 1打开Git Bash 2 在目录下输入指令&#xff1a; touch ~/.bashrc在文件中写入内容&#xff1a; #用于输出git提交日志 alias git-loggit log --prettyoneline --all --graph --abbrev-commit #用于输出当前目录所有文件及基本信息 al…

百度搜索智能化算力调控分配方法

作者 | 泰来 导读 随着近年深度学习技术的发展&#xff0c;搜索算法复杂度不断上升&#xff0c;算力供给需求出现了爆发式的增长。伴随着AI技术逐步走到深水区&#xff0c;算法红利在逐步消失&#xff0c;边际效应日益显著&#xff0c;算力效能的提升尤为重要&#xff0c;同时随…

【接口自动化测试】Postman(一) 介绍和安装

一.Postman介绍 Postman是一款非常流行的接口调试工具&#xff0c;它使用简单&#xff0c;而且功能也很强大。不仅测试人员会使用&#xff0c;开发人员也会 经常使用。 主要特点 1. 简单易用的图形用户界面 2. 可以保存接口请求的历史记录 3. 使用测试集Collections可以更…

rocketmq5.X 单机搭建 虚拟机搭建rocketmq5.1.4 搭建最新版本mq rocketmq5.1.4版本单体搭建 rocketmq(一)

1. 官网下载地址&#xff1a; 下载 | RocketMQ 2. 配置环境&#xff1a; 我是在/etc/profile.d 新建了一个rocketmq_env.sh 配置了jdk, maven, 以及mq. mq文件下载的 配置完之后&#xff0c;刷新环境source /etc/profile 3. 配置rocket mq 的jvm配置&#xff0c;就是两个启…

OpenAI:我们暂停了ChatGPT Plus新用户注册

今天中午&#xff0c;OpenAI 首席执行官 Sam Altman 在 X 平台发文说&#xff0c;将暂停 ChatGPT Plus 新用户注册。 we are pausing new ChatGPT Plus sign-ups for a bit > :( the surge in usage post devday has exceeded our c> apacity and we want to make sure e…

UI自动化测试框架的搭建(详解)

前言 今天给大家分享一个seleniumtestngmavenant的UI自动化&#xff0c;可以用于功能测试&#xff0c;也可按复杂的业务流程编写测试用例&#xff0c;今天此篇文章不过多讲解如何实现CI/CD&#xff0c;只讲解自己能独立搭建UI框架&#xff0c;需要阅读者有一定的java语言基础&…

Redis概述

Redis是一款NoSql(非关系型)数据库&#xff0c;实现了主从同步。 使用场景&#xff1a; 对数据高并发的读写。 海量数据的读写。 对数据的可扩展性的。 NoSql数据库举例&#xff1a; Memcache&#xff1a;数据都在内存中&#xff0c;但是数据不持久化&#xff0c;而且只支…

巷议:跌落尘埃与风光无限

近几来制造业的退潮是不争的事实&#xff0c;其中以老资格直辖市天津尤为突出。曾记否&#xff0c;想当年韩国的三星集团是天津最强的外企&#xff0c;但是从2015年开始便撤离了&#xff0c;给天津经济带来了重创。 而天津的汽车产业&#xff0c;也日渐变得软弱。其中那曾经小…

JavaScript语法、语句、数据类型

一、JavaScript语法&#xff1a; 1、JavaScript字面量&#xff1a; JavaScript中的固定值称为字面量。数字字面量可以是整数、小数或者科学计数&#xff08;e&#xff09;,如3.1415926、1008、123e5等&#xff1b;字符串字面量可以使用单引号或者双引号&#xff0c;如“corli…
最新文章