因为学习 spring框架的 AOP 所以,这里复习下动态代理,但是 spring 的底层动态代理实现是 cglib,jdk 这种呢可以引导新手入门

spring AOP 横向抽取机制 最典型的应用当属 log ,transaction 了,具体可以从配置文件的配置以及注解看出

首先基于 jdk 的动态代理需要借助于

jdk 中 reflect 包下(java.lang.reflect.Proxy)的 Proxy

以及(java.lang.reflect.InvocationHandler) InvacationHandler

去生成代理对象。

局限性是这种动态代理只适用于对有接口的类实现动态代理

原理其实是,利用反射机制先生成要被代理对象的同级对象然后对这个同级对象进行增强

所以这里需要传入接口

下面是代码部分详解:

首先我们定义一个简单的 动物接口 IAnimal 里面有一个简单方法 move

  1. package com.ghc.test;
  2.  
  3. public interface IAnimal {
  4. void move();
  5. }

com.ghc.test.IAnimal

然后呢,我们定义一个要被代理的类 Cat,这个类实现了 IAnimal 接口

  1. package com.ghc.test;
  2.  
  3. public class Cat implements IAnimal {
  4. @Override
  5. public void move() {
  6. System.out.println("cat run...");
  7. }
  8. }

com.ghc.test.Cat

接下来就是我们 处理器的定义了,这个唤醒处理器呢有个规范就是必须实现 接口 java.lang.reflect.InvocationHandler;

覆写里面的 invoke 方法,并且在 invoke 方法中做我们的增强,具体代码如下:

  1. package com.ghc.test;
  2.  
  3. import java.lang.reflect.InvocationHandler;
  4. import java.lang.reflect.Method;
  5. import java.lang.reflect.Proxy;
  6.  
  7. public class AnimalInvocationHandler implements InvocationHandler {
  8. // 定义要被代理的类
  9. private Object tar;
  10. public AnimalInvocationHandler(Object tar){
  11. this.tar=tar;
  12. }
  13.  
  14. @Override
  15. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  16. System.out.println("前置增强处......");
  17. Object result = method.invoke(tar,args);
  18. System.out.println("后置增强处......");
  19. return result;
  20. }
  21. public Object getProxyInstance(){
  22. return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),tar.getClass().getInterfaces(),this);
  23. }
  24. }

com.ghc.test.AnimalInvocationHandler

当然,上面其中一个方法 getProxyInstance 其实是可以定义在使用的地方的。这都不是重点

重点来了,就是我们如何使用呢:

  1. import com.ghc.test.AnimalInvocationHandler;
  2. import com.ghc.test.Cat;
  3. import com.ghc.test.IAnimal;
  4. import org.junit.Test;
  5.  
  6. public class DynamicProxyTest {
  7. @Test
  8. public void testCatProxy(){
  9. //先创建要被代理的对象
  10. Cat cat = new Cat();
  11. AnimalInvocationHandler animalInvocationHandler=new AnimalInvocationHandler(cat);
  12. IAnimal catProxy = (IAnimal) animalInvocationHandler.getProxyInstance();
  13. catProxy.move();
  14. }
  15. }

DynamicProxyTest

结果如图:

jdk 动态代理实现对目标对象的增强的更多相关文章

  1. jdk动态代理 要把目标对象 和自己都传进去;以便自己对目标对象的代理

  2. java jdk动态代理模式举例浅析

    代理模式概述 代理模式是为了提供额外或不同的操作,而插入的用来替代”实际”对象的对象,这些操作涉及到与”实际”对象的通信,因此代理通常充当中间人角色. java中常用的动态代理模式为jdk动态代理和c ...

  3. Java的三种代理模式:静态代理/JDK动态代理/Cglib动态代理

    1.静态代理:需要定义接口或者父类,目标对象与代理对象均实现同一接口或继承同一父类. 2.JDK动态代理:需要目标对象实现一个接口,通过动态反射的机制,生成代理对象,实现同一个接口 3.Cglib动态 ...

  4. 获取JDK动态代理/CGLIB代理对象代理的目标对象。

    问题描述:: 我现在遇到个棘手的问题,要通过spring托管的service类保存对象,这个类是通过反射拿到的,经过实验发现这个类只能反射取得sservice实现了接口的方法,而extends类的方法 ...

  5. Spring中的JDK动态代理

    Spring中的JDK动态代理 在JDK1.3以后提供了动态代理的技术,允许开发者在运行期创建接口的代理实例.在Sun刚推出动态代理时,还很难想象它有多大的实际用途,现在动态代理是实现AOP的绝好底层 ...

  6. Spring AOP详解 、 JDK动态代理、CGLib动态代理

    AOP是Aspect Oriented Programing的简称,面向切面编程.AOP适合于那些具有横切逻辑的应用:如性能监测,访问控制,事务管理以及日志记录.AOP将这些分散在各个业务逻辑中的代码 ...

  7. JDK动态代理与Cglib库

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

  8. JDK动态代理实现原理--转载

    之前虽然会用JDK的动态代理,但是有些问题却一直没有搞明白.比如说:InvocationHandler的invoke方法是由谁来调用的,代理对象是怎么生成的,直到前几个星期才把这些问题全部搞明白了.  ...

  9. Spring AOP高级——源码实现(3)AopProxy代理对象之JDK动态代理的创建过程

    spring-aop-4.3.7.RELEASE  在<Spring AOP高级——源码实现(1)动态代理技术>中介绍了两种动态代理技术,当然在Spring AOP中代理对象的生成也是运用 ...

随机推荐

  1. memcached 和redis比较

    同属于NOSQL存储,网上流传很多memcached能做的是redis都可以做,为什么基本现在两种都火,原因他们有各自擅长的地方. memcahed内部采用多核模式,单列运行很快.memcached采 ...

  2. Unity3D与C#网站收藏

    siki学院(目前学习ing) http://www.sikiedu.com/ 雨松MOMO研究院 http://www.xuanyusong.com/ 知乎:Unity 开发教程相关回答(初步了解下 ...

  3. NameNode内存溢出和DataNode请求超时异常处理

    问题背景 春节假期间,接连收到监控程序发出的数据异常问题,赶忙连接上跳板机检查各服务间的状态,发现Datanode在第二台.第三台从节点都掉线了,通过查看Datanode和Namenode运行日志,发 ...

  4. 甲题题解-1116. Come on! Let’s C (20)-(素数筛选法)

    用vis标记出现过的id,checked标记询问过的id.至于如何判断排名为素数,用素数筛选法预处理一下即可,水题. #include <iostream> #include <cs ...

  5. Linux内核实验作业四

    实验作业:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 20135313吴子怡.北京电子科技学院 [第一部分]使用库函数API来获取用户标识号.库函数为getuid() 代码如下: ...

  6. 20135316王剑桥Linux内核学习笔记第四周

    20135316王剑桥 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 1.内核态:在高执行级别,代码可 ...

  7. 在iOS9 中使用3D Touch

    iOS9提供了四类API( Home Screen Quick Action . UIKit Peek & Pop . WebView Peek & Pop 和 UITouch For ...

  8. 《Toward an SDN-Enabled Big Data Platform for Social TV Analysis》--2015--Han Hu

    <面向应用于社会TV分析的应用了SDN的大数据平台> Abstract social TV analytics 是什么,就是说很多TV观众在微博.微信和推特等这些地方分享他们的观感时,然后 ...

  9. (改进)Python语言实现词频统计

    需求: 1.设计一个词频统计的程序. 2.英语文章中包含的英语标点符号不计入统计. 3.将统计结果按照单词的出现频率由大到小进行排序. 设计: 1.基本功能和用法会在程序中进行提示. 2.原理是利用分 ...

  10. HDU 2051 Bitset

    http://acm.hdu.edu.cn/showproblem.php?pid=2051 Problem Description Give you a number on base ten,you ...