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相关推荐

  1. 用Java动态代理实现AOP

    在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,本文主要讲述用Java动态代理实现AOP,更多Java专业知识,广州疯狂java培训 ...

  2. Java初学者如何迈出AOP第一步--使用Java 动态代理实现AOP

    Java初学者如何迈出AOP第一步--使用Java 动态代理实现AOP xBird 原创  (参与分:36,专家分:90)   发表:2004-9-3 上午9:37   版本:1.0   阅读:160 ...

  3. (转)java动态代理与aop

    转自: Java 动态代理与AOP - 如果的事 - 博客园动态代理与AOP 代理模式 代理模式给某一个目标对象(target)提供代理对象(proxy),并由代理对象控制对target对象的引用. ...

  4. JAVA基础资料 Java动态代理实现AOP

    Java动态代理实现AOP 目前整个开发社区对AOP(Aspect Oriented Programing)推崇备至,也涌现出大量支持AOP的优秀Framework,--Spring, JAC, Jb ...

  5. 记一次Java动态代理实践

    导语:在Java生态中,我们经常直接或者间接的用到动态代理,比如通过动态代理调用远程服务,再比如通过动态代理实现解耦.本文结合京东服务框架JSF,讲述京东使用动态代理进行抽象的一次实践,以达到升级数据 ...

  6. java动态代理(AOP)

    一.使用jdk自带的动态代理机制: 定义一个普通的接口及实现类: 定义一个InvocationHandler的实现类用于织入横向插入的操作(此处为打印信息): 生成接口的代理类: 调用接口方法,实现动 ...

  7. Java动态代理模拟spring的AOP

    广州疯狂软件学院拥有三大课程体系包括:java课程,android课程,ios课程,疯狂软件年终钜惠,报名java就业班,免费赠送基础班,名额有限,本月火热报名中,欢迎有志之士电话或者咨询. spri ...

  8. java动态代理实现与原理详细分析(代码层面解释了AOP的实现)

    关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理. 一.代理模式    代理模式是常用的java设计模式, ...

  9. Java动态代理的实现

    动态代理作为代理模式的一种扩展形式,广泛应用于框架(尤其是基于AOP的框架)的设计与开发,本文将通过实例来讲解Java动态代理的实现过程. 友情提示:本文略有难度,读者需具备代理模式相关基础知识,. ...

最新文章

  1. 非线性优化:徒手实现LM算法
  2. 在 Linux 和 Windows 下源码安装 Perl
  3. Ajax[Mount]
  4. zoj 2760 How Many Shortest Path 最大流
  5. 飞控所有PID参数都无法消除振荡问题
  6. 有没有测试人心里的软件,心理测评,认识自己的有效工具:(二)你做的可能是假的心理测试...
  7. bootstrap grid php,bootstrap grid用法
  8. python线程池模块第三方包_python线程池(threadpool)模块使用笔记详解
  9. 大数据学习笔记57:Java代码操作HBase
  10. mysql 查询商品列表 显示tag_008商城项目:商品列表查询-查出商品并且分页
  11. java对象占用内存的说法_JAVA 中关于对象成员占用内存的说法哪个正确 (3.0分)_学小易找答案...
  12. stm8s电机库vtimer_SetTimer()函数的使用
  13. dreamware html中加入flv,Dreamweaver插入FLV文件技巧
  14. 【金融财经】金融市场一周简报(2017-09-15)
  15. jpg图片太大怎么压缩变小
  16. android记账本登录界面,Android记账本开发(一):整体UI界面布局
  17. 直接调节风扇转速的Windows开源工具--Open Hardware Monitor
  18. 一加7t人脸识别_90Hz新品,一加7T系列国内发布日期官宣
  19. 阿里巴巴计划今日中午推出1688.com批发网
  20. 域控服务器新建共享文件夹,在ActiveDirectory中如何创建共享文件夹?

热门文章

  1. Endnote技巧:解决中英参考文献混排问题,附国标文件
  2. 网页设计作业_Dreamweaver简单网页成品
  3. PriorityQueue和queue的区别
  4. 华为电脑c语言总是错误,关于华为机试题求代码!解决方法
  5. pthon3精要(12)-扩展序列解包
  6. [NOI2009] 植物大战僵尸
  7. 【Python】学习Python的三个神级网站
  8. 【深度学习】Keras vs PyTorch vs Caffe:CNN实现对比
  9. 【深度学习】9 大主题卷积神经网络(CNN)的 PyTorch 实现
  10. 8个超好用的Python内置函数,提升效率必备!