文档章节

java JDK动态代理

编程SHA
 编程SHA
发布于 2018/10/19 21:52
字数 810
阅读 6
收藏 0

本篇随笔是对java动态代理中的JDK代理方式的具体实现。

首先需要定义一个接口,为其定义了两个方法:

 
public interface UserService { public void add(); public void delete(); } 

然后需要一个实现这个接口的实现类:

 
public class UserServiceImpl implements UserService { @Override public void add() {    //添加一些操作 System.out.println("UserServiceImpl中的add()方法被执行了"); } @Override public void delete() {    //添加一些操作 System.out.println("UserServiceImpl中的delete()方法被执行了"); } } 

此时如果要在调用add()方法和delete()方法时先输入一句话:System.out.println("动态代理开启");

第一种方式:直接在方法体内部输出,此时就会出现一个问题:“硬编码”,对以后的扩展不方便。

第二种方式:使用java中动态代理机制,主要有JDK和CGLIB两种方式。本文主要使用JDK的方式。

此时,创建一个动态代理类:

 
public class DynaProxyInvocationHandler implements InvocationHandler { // 定义被代理对象,该对象必须实现了至少一个接口 private Object target; // 定义代理方法,该方法代理后的返回值类型是被代理对象原类型 public Object Proxy(Object target) { this.target=target; return Proxy.newProxyInstance( this.target.getClass().getClassLoader(), this.target.getClass().getInterfaces(), this); } /** * 当一个类实现了InvocationHandler接口后,必须实现invoke方法 * 而这个方法就是增强被代理对象的方法 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("动态代理开启"); return method.invoke(this.target, args); } } 

其中的Proxy是JDK为我们提供的动态代理对象,该对象提供了newProxyInstance()来进行初始化,参数说明如下:

第一个参数:被代理对象的类装载器

第二个参数:被代理对象所实现的接口

第三个参数:实现InvocationHandler接口的类

而其中的invoke方法中有着三个参数:

第一个参数:代理对象,一般在动态代理中不会使用。

第二个参数:被代理对象所执行的方法

第三个参数:被代理对象所执行的方法的参数列表

此时,可以建立一个测试类查看一下效果:

 
public class DynaProxtTest { public static void main(String[] args) { // 创建被代理对象 UserService userService = new UserServiceImpl(); // 对象UserService进行代理 UserService us = (UserService)new DynaProxyInvocationHandler().Proxy(userService); //调用代理后的方法 us.add();    System.out.println("============="); us.delete(); } } 

此时控制台的输出会是:

 
动态代理开启 UserServiceImpl中的add()方法被执行了 ============= 动态代理开启 UserServiceImpl中的delete()方法被执行了 

此时,如果要对代理方法进行限制,可以使用以下方法:

 
@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; if(method.getName().contains("add")) { System.out.println("动态代理开启"); result = method.invoke(this.target, args); }else { result = method.invoke(this.target, args); } return result; } 

此时控制台的输出会是:

 
动态代理开启 UserServiceImpl中的add()方法被执行了 ============= UserServiceImpl中的delete()方法被执行了   

因为Spring的AOP就是通过动态代理的机制实现的,所以还是需要好好的理解动态代理的机制的。

© 著作权归作者所有

共有 人打赏支持
上一篇: java生成UUID
下一篇: Java GC机制详解
编程SHA
粉丝 5
博文 72
码字总数 162749
作品 0
长沙
私信 提问
动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

在运行时期可以按照Java虚拟机规范对class文件的组织规则生成对应的二进制字节码。当前有很多开源框架可以完成这些功能,如ASM,Javassist。 动态代理机制详解(JDK 和CGLIB,Javassist,ASM...

素雷
2017/10/19
0
0
java动态代理(JDK和cglib)

JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代...

长平狐
2012/10/09
272
0
Java面试基础篇——第十五篇:代理模式

什么是代理? 通过代理控制对象的访问,可以详细访问某个对象的方法,在这个方法调用处理,或调用后处理。 代理应用场景 安全代理 可以屏蔽真实角色远程代理 远程调用代理类RMI延迟加载 先加载...

developlee的潇洒人生
2018/08/02
0
0
3.2 Spring AOP的设计与实现

JVM的动态代理特性 在Spring AOP实现中,使用的核心技术是动态代理,这实际上是JDK的一个特性(JDK1.3以上的版本有这个特性)。通过JDK的动态代理特性,可以为任意Java对象创建代理对象,对于...

edwardGe
2018/05/30
0
0
咕泡-代理 proxy 设计模式笔记

##查看代码:https://gitee.com/jly521/proxy.git 代理模式(Proxy) 应用场景:为其他对象提供一种代理以控制对这个对象的访问 从结构上来看和Decorator 模式类似, 但Proxy 是控制,更像是...

职业搬砖20年
2018/08/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 舔狗是没有好下场的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @我没有抓狂 :#今天听什么# #今天听这个# 分享 Nirvana 的歌曲《Smells Like Teen Spi...》 《Smells Like Teen Spi...》- Nirvana 手机党少...

小小编辑
今天
126
4
Linux Wireshark普通用户启动使用方案

当系统安装好Wireshark后请正常启动是否可以进行正常使用,如果不行请参考下列指导 向系统添加一个用户组 sudo groupadd wireshark //如提示此组存在可跳过 将指定用户添加到这个组中 sudo...

CHONGCHEN
今天
2
0
CSS 选择器参考手册

CSS 选择器参考手册 选择器 描述 [attribute] 用于选取带有指定属性的元素。 [attribute=value] 用于选取带有指定属性和值的元素。 [attribute~=value] 用于选取属性值中包含指定词汇的元素。...

Jack088
今天
2
0
数据库篇一

数据库篇 第1章 数据库介绍 1.1 数据库概述  什么是数据库(DB:DataBase) 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据...

stars永恒
今天
6
0
Intellij IDEA中设置了jsp页面,但是在访问页面时却提示404

在Intellij IDEA中设置了spring boot的jsp页面,但是在访问时,却出现404,Not Found,经过查找资料后解决,步骤如下: 在Run/Debug Configurations面板中设置该程序的Working Directory选项...

uknow8692
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部