【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 {@Overridepublic void test1() {System.out.println("执行test1()方法");}@Overridepublic 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;}@Overridepublic 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.hqwc.cn/news/180000.html

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

相关文章

【Web 实战】记一次攻防实战

经典开局一个登录框 由于漏洞应该还未修复。对于数据和相关网址打个码见谅一下 常规思路&#xff08;爆破&#xff09; 常规操作进行一波 尝试弱口令然后开始爆破 对于此种有验证码的爆破&#xff0c;可以借用一个bp插件。 captcha-killer-modified-jdk14.jar 具体使用我就…

【数据结构】希尔排序(最小增量排序)

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;数据结构 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵 希望大佬指点一二 如果文章对你有帮助…

Linux下SPI环回测试

文章目录 前言一、回环测试代码1.1 头文件 spidev.h2.2 c代码 spidev_test.c 二、 编译验证2.1 交叉编译2.2 测试 前言 linux下做spi回环测试 一、回环测试代码 1.1 头文件 spidev.h /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ /** include/linux/spi…

Vue3:父组件向子组件传值(Props)

背景 在Vue3项目里&#xff0c;页面A&#xff08;在views文件夹里&#xff09;需要读取某个接口的数据&#xff0c;而页面A引入的组件a&#xff08;在components文件夹里&#xff09;也需要读取该接口的数据为了避免重复读取数据从而造成资源浪费&#xff0c;可以利用传值来实…

halcon识别验证码,先训练后识别

识别验证码图片&#xff0c;使用halcon 21.05 下面代码识别准确率100% 目录 训练&#xff0c;图片打标签使用代码创建分类器&#xff1b;识别验证码&#xff0c;检验识别效果使用“助手”加载训练文件&#xff0c;加载训练分类器&#xff0c;察看收集的字符&#xff0c;训练识别…

软件测试需求分析

1.1 需求的重要性 1.1.1 软件缺陷的8020原则 1) 在软件测试过程中&#xff0c;从需求分析开始到集成测试阶段引入测试手段&#xff0c;能发现所有缺陷的80%&#xff1b;系统测试阶段引入测试手段&#xff0c;能发现剩余缺陷中80%的缺陷&#xff1b;在运行维护阶段经过长…

HTTP 常见的请求头

面试官&#xff1a;说说 HTTP 常见的请求头有哪些? 作用&#xff1f; 一、是什么 HTTP头字段&#xff08;HTTP header fields&#xff09;,是指在超文本传输协议&#xff08;HTTP&#xff09;的请求和响应消息中的消息头部分 它们定义了一个超文本传输协议事务中的操作参数 …

为什么说MES管理系统是车间层与管理层的桥梁

随着制造业的快速发展&#xff0c;企业对于生产过程中的管理要求越来越高。为了满足这一需求&#xff0c;MES生产管理系统应运而生。MES管理系统作为车间层与管理层之间的桥梁&#xff0c;扮演着至关重要的角色。本文将探讨为什么说MES管理系统是车间层与管理层之间的桥梁。 一…

安装宝塔,使用宝塔自动部署

这里用的是华为云服务器&#xff0c;其实也就是普普通通的一个linux操作系统 首先我们来到宝塔官网地址 宝塔面板下载&#xff0c;免费全能的服务器运维软件 (bt.cn) 翻到下面&#xff0c;会有使用脚本安装的命令。 yum install -y wget && wget -O install.sh https:/…

[已解决]使用order by 排序后的是10 6 7 8 9 而不是 6 7 8 9 10?

问题 sql order by 排序后的为什么 是10 6 7 8 9 而不是 6 7 8 9 10? 思路 在 SQL 中&#xff0c;ORDER BY 默认的排序方式是升序&#xff08;从小到大&#xff09;。所以&#xff0c;如果您简单地使用 ORDER BY 对某个列进行排序&#xff0c;它会将数字按照升序排列&#…

sCrypt Playground 发布

sCrypt Playground 发布了。 与桌面IDE 完全相同的功能&#xff0c;但是无需安装。体验地址: https://playground.scrypt.io。 请不要在 sCrypt Playground 上存储重要数据。我们会不定时清除用户保存在其上的数据。

Java的类与Golang的结构体的区别

Java作为一门面向对象&#xff08;OOP&#xff09;的编程语言&#xff0c;它有类&#xff08;class&#xff09;的存在&#xff0c;而对于Golang&#xff0c;它不完全遵从OOP编程语言的设计思想&#xff0c;但它也有类似Java类的结构存在&#xff0c;那就是结构体&#xff08;s…