动态代理模式和AOP探究

java强大的反射机制给动态代理带来了可能、能够自由穿梭在类与方法之间、简直神通广大、

动态代理的一个小例子,顺便看看神奇的AOP是如何实现的、代码如下:

首先声明的是一个接口Dog类

1 package com.chenjun.test;
2
3 public interface Dog
4 {
5     public void info();
6     public void run();
7 }

然后一个“猎狗类”实现了该接口

 1 package com.chenjun.test;
 2
 3 public class GunDog implements Dog
 4 {
 5
 6     @Override
 7     public void info()
 8     {
 9         // TODO 自动生成的方法存根
10         System.out.println("猎狗");
11     }
12
13     @Override
14     public void run()
15     {
16         // TODO 自动生成的方法存根
17         System.out.println("迅速奔跑");
18     }
19
20 }

然后是一个用于切面编程的AOP类,比如在鬣狗类的方法执行前后分别调用method1和method2

代码如下:

 1 package com.chenjun.test;
 2
 3 public class DogAop
 4 {
 5
 6     public void method1()
 7     {
 8         System.out.println(" AOP method1");
 9     }
10     public void method2()
11     {
12         System.out.println(" AOP method2");
13     }
14
15 }

然后本例的最重要的一个类登场:

AOP将实际target调用的方法无情夹杀、  形成所谓的AOP

 1 /**
 2  *
 3  */
 4 package com.chenjun.test;
 5
 6 import java.lang.reflect.InvocationHandler;
 7 import java.lang.reflect.Method;
 8
 9 /**
10  * @author Administrator
11  *
12  */
13 public class MyInvocationHandle implements InvocationHandler
14 {
15     //需要被代理的对象
16     /* (非 Javadoc)
17      * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
18      */
19     private Object target;   //需要被代理的目标对象
20     public void setTarget(Object target)
21     {
22         this.target = target;  //设置需要被代理的目标对象
23     }
24     public Object invoke(Object proxy, Method method, Object[] args)  //开始代理了。挂羊头卖狗肉开始
25             throws Throwable
26     {
27         // TODO 自动生成的方法存根
28         DogAop dogAop = new DogAop();  //用于AOP的类实例化
29         dogAop.method1();  //AOP方法1
30         Object result = method.invoke(target, args);  //真实的方法调用。利用反射
31         dogAop.method2();  //aop方法2
32
33         return result;
34     }
35
36 }

最后来个主函数:

 1 package com.chenjun.test;
 2
 3 import java.lang.reflect.Proxy;
 4
 5 public class Main
 6 {
 7     public static void main(String []args)
 8     {
 9         Dog target = new GunDog();  //new一个需要被动态代理的对象
10         MyInvocationHandle handler = new MyInvocationHandle();
11         handler.setTarget(target);  //挂羊头卖狗肉开始
12
13         Dog dog  = (Dog)Proxy.newProxyInstance(target.getClass().getClassLoader(),
14                 target.getClass().getInterfaces(),
15                 handler);
16         dog.info();  //明修栈道,暗度陈仓 ,内部已经调用了代理类的方法。原对象的方法被添油加醋了、
17         dog.run();   //同上
18     }
19 }
时间: 2024-10-13 23:48:34

动态代理模式和AOP探究的相关文章

反射实现AOP动态代理模式(Spring AOP实现原理)

其实AOP的意思就是面向切面编程. OO注重的是我们解决问题的方法(封装成Method),而AOP注重的是许多解决问题的方法中的共同点,是对OO思想的一种补充! 还是拿人家经常举的一个例子讲解一下吧: 比如说,我们现在要开发的一个应用里面有很多的业务方法,但是,我们现在要对这个方法的执行做全面监控,或部分监控.也许我们就会在要一些方法前去加上一条日志记录. 我们写个例子看看我们最简单的解决方案 我们先写一个接口IHello.java代码如下: package sinosoft.dj.aop.st

Java静态代理与动态代理模式的实现

前言:    在现实生活中,考虑以下的场景:小王打算要去租房,他相中了一个房子,准备去找房东洽谈相关事宜.但是房东他很忙,平时上班没时间,总没有时间见面,他也没办法.后来,房东想了一个办法,他找到了一个人代替自己和小王洽谈,房东本人不用出面,他只要把他的对房客的要求告诉他找的那个人,那个人和你商量就可以了,这样就可以完成租房这件事了.这种现实场景比比皆是,所呈现出来的其实就是代理模式的原型的一种.我们把焦点转向编程,你是否在编程中经常遇见这样一个问题,对于访问某个对象,我们希望给它的方法前加入一

关于装饰模式和动态代理模式

装饰模式和动态代理模式乍一看差不多,都是动态的增加行为,其实有各自的区别. 一.首先我们看一下装饰设计模式,其基本思想如下: 1.编写一个类,实现与被装饰类相同的接口.目的使他们有相同的行为 2.定义一个实例变量,引用被装饰对象.目的和原来的老对象进行交接 3.定义构造方法,把被装饰对象注入进来. 4.对于不需要改写的方法,调用被装饰对象的. 5.对于要改写的方法,改写即可. 废话不多说,举一个例子,模拟实现一个数据库连接池,在这里,我想重写close方法,以实现调用close方法之后不是关闭连

23种设计模式----------代理模式(三) 之 动态代理模式

(上一篇)种设计模式----------代理模式(二) 当然代理模式中,用的最广泛的,用的最多的是  动态代理模式. 动态代理:就是实现阶段不用关系代理是哪个,而在运行阶段指定具体哪个代理. 抽象接口的类图如下: --图来自设计模式之禅 所以动态代理模式要有一个InvocationHandler接口 和 GamePlayerIH实现类.其中 InvocationHandler是JD提供的动态代理接口,对被代理类的方法进行代理. 代码实现如下 抽象主题类或者接口: 1 package com.ye

动态代理模式--源码分析

Proxy源码 1,成员变量 ?代理类的构造函数参数.默认每个代理类都具有一个invocationHandler的构造方法.(本文代码主要基于jdk 1.7) /** parameter types of a proxy class constructor */ private static final Class<?>[] constructorParams = { InvocationHandler.class }; ?缓存代理对象. private static final WeakCa

动态代理模式

动态代理模式简介: 动态代理能够自动监听代理对象的方法,并且能够自动生成代理类的代码,这样就不需要我们自己去重写代理对象里的方法了,这样解决了代理类代码因业务庞大而庞大的问题,因为动态代理模式会在代码运行时根据代码来在内存中动态生成一个代理类自动重写代理对象[学Java,到凯哥学堂kaige123.com]的方法,然后这个动态代理类再调用处理类里的代码,处理类再调用到实际方法上去.而且我们可以选择性的监听代理对象的方法,有些不需监听的方法就可以在处理类中过滤掉.所以动态代理的优势就在于可以自动的

java 动态代理模式

一.相关类及其方法:java.lang.reflect.Proxy,Proxy 提供用于创建动态代理类和实例的静态方法.newProxyInstance()返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序(详见api文档) java.lang.reflect.InvocationHandler,InvocationHandler 是代理实例的调用处理程序 实现的接口.invoke()在代理实例上处理方法调用并返回结果.在与方法关联的代理实例上调用方法时,将在调用处理程序

Java-马士兵动态代理模式

Java-马士兵动态代理模式 模拟jdk的动态代理的实现原理, 这些东西没有必要写出来,写项目的时候用不上,主要是面试和理解原理: ? 有些工具可以直接生成二进制码,没有必要生成文件. 代理模式-聚合与继承方式比较 参考地址:http://www.cnblogs.com/shamgod/p/4591782.html ? 一.概述 1.目标:要在Tank的move()方法做时间代理及日志代理(可以设想以后还要增加很多代理处理),且代理间的顺序可活更换 2.思路: (1)聚合:代理类聚合了被代理类,

设计模式之动态代理模式

设计模式之动态代理模式 代理模式: Provide a surrogate or placeholder for another object to controlaccess to it(为其他对象提供一种代理以控制对这个对象的访问).使用代理模式创建代理对象,让代理对象控制目标对象的访问(目标对象可以是远程的对象.创建开销 大的对象或需要安全控制的对象),并且可以在不改变目标对象的情况下添加一些额外的功能. 代理模式相关内容详见本人之前文章:http://www.cnblogs.com/zh