Java 动态代理实践AOP
2019独角兽企业重金招聘Python工程师标准>>>
大家都知道Spring中AOP是通过Java动态代理实现的,今天就来简单学习下demo。
Java动态代理主要有两个核心类,InvocationHandler和Proxy。
/*** {@code InvocationHandler} is the interface implemented by* the <i>invocation handler</i> of a proxy instance.** <p>Each proxy instance has an associated invocation handler.* When a method is invoked on a proxy instance, the method* invocation is encoded and dispatched to the {@code invoke}* method of its invocation handler.** @author Peter Jones* @see Proxy* @since 1.3*/
public interface InvocationHandler
所有的Handler类要实现InvocationHandler接口,并关联到Proxy实例上,最后会分发到InvocationHandler的invoke方法上。
/*** {@code Proxy} provides static methods for creating dynamic proxy* classes and instances, and it is also the superclass of all* dynamic proxy classes created by those methods.** <p>To create a proxy for some interface {@code Foo}:* <pre>* InvocationHandler handler = new MyInvocationHandler(...);* Class proxyClass = Proxy.getProxyClass(* Foo.class.getClassLoader(), new Class[] { Foo.class });* Foo f = (Foo) proxyClass.* getConstructor(new Class[] { InvocationHandler.class }).* newInstance(new Object[] { handler });* </pre>* or more simply:* <pre>* Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),* new Class[] { Foo.class },* handler);* </pre>******************************/
public class Proxy implements java.io.Serializable
通过该类的静态方法创建要动态代理的类。
下面看下demo
1. 先创建一个接口
public interface TargetInterface {int targetMethod(int num);
}
2. 实例化该接口
public class TargetClass implements TargetInterface {@Overridepublic int targetMethod(int number) {System.out.println("调用目标类的方法targetMethod..."); return number; }
}
3. 创建代理处理类,InvocationHandler子类
public class ProxyHandler implements InvocationHandler {Object concreteClass;public ProxyHandler(Object concreteClass) {this.concreteClass = concreteClass;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {System.out.println("proxy:"+proxy.getClass().getName()); System.out.println("method:"+method.getName()); System.out.println("args:"+args[0].getClass().getName()); System.out.println("Before invoke method..."); Object object = method.invoke(concreteClass, args);System.out.println("After invoke method..."); return object; }
}
proxy: 指代我们所代理的那个真实对象 method: 指代的是我们所要调用真实对象的某个方法的Method对象 args: 指代的是调用真实对象某个方法时接受的参数
public class Example {public static void main(String[] args) {TargetClass cc = new TargetClass();InvocationHandler ih = new ProxyHandler(cc);TargetInterface tf = (TargetInterface) Proxy.newProxyInstance(cc.getClass().getClassLoader(), cc.getClass().getInterfaces(), ih);int i = tf.targetMethod(5);}
}
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentExceptionloader: 一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载
interfaces: 一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了
h: 一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上
注意:通过 Proxy.newProxyInstance 创建的代理对象是在jvm运行时动态生成的一个对象,它并不是我们的InvocationHandler类型,也不是我们定义的那组接口的类型,而是在运行是动态生成的一个对象,并且命名方式都是这样的形式,以$开头,proxy为中,最后一个数字表示对象的标号。
动态代理有个缺陷,就是创建时需要参数interfaces,即被代理的类,需要实现该接口。
转载于:https://my.oschina.net/android520/blog/700945
Java 动态代理实践AOP相关推荐
- 用Java动态代理实现AOP
在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,本文主要讲述用Java动态代理实现AOP,更多Java专业知识,广州疯狂java培训 ...
- Java初学者如何迈出AOP第一步--使用Java 动态代理实现AOP
Java初学者如何迈出AOP第一步--使用Java 动态代理实现AOP xBird 原创 (参与分:36,专家分:90) 发表:2004-9-3 上午9:37 版本:1.0 阅读:160 ...
- (转)java动态代理与aop
转自: Java 动态代理与AOP - 如果的事 - 博客园动态代理与AOP 代理模式 代理模式给某一个目标对象(target)提供代理对象(proxy),并由代理对象控制对target对象的引用. ...
- JAVA基础资料 Java动态代理实现AOP
Java动态代理实现AOP 目前整个开发社区对AOP(Aspect Oriented Programing)推崇备至,也涌现出大量支持AOP的优秀Framework,--Spring, JAC, Jb ...
- 记一次Java动态代理实践
导语:在Java生态中,我们经常直接或者间接的用到动态代理,比如通过动态代理调用远程服务,再比如通过动态代理实现解耦.本文结合京东服务框架JSF,讲述京东使用动态代理进行抽象的一次实践,以达到升级数据 ...
- java动态代理(AOP)
一.使用jdk自带的动态代理机制: 定义一个普通的接口及实现类: 定义一个InvocationHandler的实现类用于织入横向插入的操作(此处为打印信息): 生成接口的代理类: 调用接口方法,实现动 ...
- Java动态代理模拟spring的AOP
广州疯狂软件学院拥有三大课程体系包括:java课程,android课程,ios课程,疯狂软件年终钜惠,报名java就业班,免费赠送基础班,名额有限,本月火热报名中,欢迎有志之士电话或者咨询. spri ...
- java动态代理实现与原理详细分析(代码层面解释了AOP的实现)
关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理. 一.代理模式 代理模式是常用的java设计模式, ...
- Java动态代理的实现
动态代理作为代理模式的一种扩展形式,广泛应用于框架(尤其是基于AOP的框架)的设计与开发,本文将通过实例来讲解Java动态代理的实现过程. 友情提示:本文略有难度,读者需具备代理模式相关基础知识,. ...
最新文章
- 非线性优化:徒手实现LM算法
- 在 Linux 和 Windows 下源码安装 Perl
- Ajax[Mount]
- zoj 2760 How Many Shortest Path 最大流
- 飞控所有PID参数都无法消除振荡问题
- 有没有测试人心里的软件,心理测评,认识自己的有效工具:(二)你做的可能是假的心理测试...
- bootstrap grid php,bootstrap grid用法
- python线程池模块第三方包_python线程池(threadpool)模块使用笔记详解
- 大数据学习笔记57:Java代码操作HBase
- mysql 查询商品列表 显示tag_008商城项目:商品列表查询-查出商品并且分页
- java对象占用内存的说法_JAVA 中关于对象成员占用内存的说法哪个正确 (3.0分)_学小易找答案...
- stm8s电机库vtimer_SetTimer()函数的使用
- dreamware html中加入flv,Dreamweaver插入FLV文件技巧
- 【金融财经】金融市场一周简报(2017-09-15)
- jpg图片太大怎么压缩变小
- android记账本登录界面,Android记账本开发(一):整体UI界面布局
- 直接调节风扇转速的Windows开源工具--Open Hardware Monitor
- 一加7t人脸识别_90Hz新品,一加7T系列国内发布日期官宣
- 阿里巴巴计划今日中午推出1688.com批发网
- 域控服务器新建共享文件夹,在ActiveDirectory中如何创建共享文件夹?
热门文章
- Endnote技巧:解决中英参考文献混排问题,附国标文件
- 网页设计作业_Dreamweaver简单网页成品
- PriorityQueue和queue的区别
- 华为电脑c语言总是错误,关于华为机试题求代码!解决方法
- pthon3精要(12)-扩展序列解包
- [NOI2009] 植物大战僵尸
- 【Python】学习Python的三个神级网站
- 【深度学习】Keras vs PyTorch vs Caffe:CNN实现对比
- 【深度学习】9 大主题卷积神经网络(CNN)的 PyTorch 实现
- 8个超好用的Python内置函数,提升效率必备!