动态代理模式和AOP探究
java强大的反射机制给动态代理带来了可能、能够自由穿梭在类与方法之间、简直神通广大、
动态代理的一个小例子,顺便看看神奇的AOP是如何实现的、代码如下:
首先声明的是一个接口Dog类
package com.chenjun.test; public interface Dog
{
public void info();
public void run();
}
然后一个“猎狗类”实现了该接口
package com.chenjun.test; public class GunDog implements Dog
{ @Override
public void info()
{
// TODO 自动生成的方法存根
System.out.println("猎狗");
} @Override
public void run()
{
// TODO 自动生成的方法存根
System.out.println("迅速奔跑");
} }
然后是一个用于切面编程的AOP类,比如在鬣狗类的方法执行前后分别调用method1和method2
代码如下:
package com.chenjun.test; public class DogAop
{ public void method1()
{
System.out.println(" AOP method1");
}
public void method2()
{
System.out.println(" AOP method2");
} }
然后本例的最重要的一个类登场:
AOP将实际target调用的方法无情夹杀、 形成所谓的AOP
/**
*
*/
package com.chenjun.test; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; /**
* @author Administrator
*
*/
public class MyInvocationHandle implements InvocationHandler
{
//需要被代理的对象
/* (非 Javadoc)
* @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
*/
private Object target; //需要被代理的目标对象
public void setTarget(Object target)
{
this.target = target; //设置需要被代理的目标对象
}
public Object invoke(Object proxy, Method method, Object[] args) //开始代理了。挂羊头卖狗肉开始
throws Throwable
{
// TODO 自动生成的方法存根
DogAop dogAop = new DogAop(); //用于AOP的类实例化
dogAop.method1(); //AOP方法1
Object result = method.invoke(target, args); //真实的方法调用。利用反射
dogAop.method2(); //aop方法2 return result;
} }
最后来个主函数:
package com.chenjun.test; import java.lang.reflect.Proxy; public class Main
{
public static void main(String []args)
{
Dog target = new GunDog(); //new一个需要被动态代理的对象
MyInvocationHandle handler = new MyInvocationHandle();
handler.setTarget(target); //挂羊头卖狗肉开始 Dog dog = (Dog)Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
handler);
dog.info(); //明修栈道,暗度陈仓 ,内部已经调用了代理类的方法。原对象的方法被添油加醋了、
dog.run(); //同上
}
}
动态代理模式和AOP探究的更多相关文章
- 反射实现 AOP 动态代理模式(Spring AOP 的实现原理)
枚举 在某些情况下,一个类的对象是有限而且固定的,比如季节类,它只有4个对象.这种实例有限而且固定的类,在Java里被称为枚举类. 枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编 ...
- 反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)
好长时间没有用过Spring了. 突然拿起书.我都发现自己对AOP都不熟悉了. 其实AOP的意思就是面向切面编程. OO注重的是我们解决问题的方法(封装成Method),而AOP注重的是许多解决解决问 ...
- Java静态代理与动态代理模式的实现
前言: 在现实生活中,考虑以下的场景:小王打算要去租房,他相中了一个房子,准备去找房东洽谈相关事宜.但是房东他很忙,平时上班没时间,总找不到时间去找他,他也没办法.后来,房东想了一个办法,他找到 ...
- java jdk动态代理模式举例浅析
代理模式概述 代理模式是为了提供额外或不同的操作,而插入的用来替代”实际”对象的对象,这些操作涉及到与”实际”对象的通信,因此代理通常充当中间人角色. java中常用的动态代理模式为jdk动态代理和c ...
- 设计模式之jdk动态代理模式、责任链模式-java实现
设计模式之JDK动态代理模式.责任链模式 需求场景 当我们的代码中的类随着业务量的增大而不断增大仿佛没有尽头时,我们可以考虑使用动态代理设计模式,代理类的代码量被固定下来,不会随着业务量的增大而增大. ...
- iOS的动态代理模式的实现
动态代理模式的应用很多,特别是在不能修改被代理类的前提下,要对执行某些方法时需要打log或者捕捉异常等处理时,是一个非常方便的方法.只需要少量修改客户端(场景类)代码和添加一个代理类就可以实现,这个符 ...
- java:struts框架2(方法的动态和静态调用,获取Servlet API三种方式(推荐IOC(控制反转)),拦截器,静态代理和动态代理(Spring AOP))
1.方法的静态和动态调用: struts.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCT ...
- JAVA动态代理模式(从现实生活角度理解代码原理)
所谓动态代理,即通过代理类:Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联. java动态代理主要是使用java.lang.reflect包中的两个 ...
- Java-马士兵动态代理模式
Java-马士兵动态代理模式 模拟jdk的动态代理的实现原理, 这些东西没有必要写出来,写项目的时候一般用不上,主要是为了面试和理解原理: java动态代理有什么作用 作用非常大,在很多底层框架中都会 ...
随机推荐
- 关于16年2月14日以后上传AppStore出现:Missing iOS Distribution signing identity for...的问题
2016年2月14日以后打包上传AppStore会发现出现如下的问题: 导致问题的原因是:下边这个证书过期了 以下是苹果官方给出的回应: Thanks for bringing this to the ...
- JAVA异常初步
1,1个图.Throwable是所有异常类的老祖宗,万恶之源.Error正常是系统级错误,控制不了,Exception类又分RuntimeException及别的异常,RuntimeException ...
- 什么时候用Model,什么时候用Entity?[转载知乎-备忘]
在建立一个实体类的时候,究竟是用Model还是用Entity?比如MVC中,Model存了数据实体,但是他被称为Model,而在EF中,Entity也是存放数据实体,却被称作Entity,这两者有何区 ...
- MAC 安装j2ee.sh的办法
It says it needs the DISPLAY variable set - what do I need to set it to? Instead of saying: ./java_e ...
- 获得URL含有中文出现乱码解决
如: http://www.htmlx.culub/?searchWord=工商代理 当获取链接中所对应searchWord的值时,出现 '%E5%B7%A5%E5%95%86%E4%BB%A3%E7 ...
- AngularJs自定义指令详解(4) - transclude
transclude默认值为false,如果设置 transclude为true,那么相应地,必须在模板代码中加入ng-transclude指令. 先看个例子: <!DOCTYPE html&g ...
- VBA常用函数
字符串相关: ①截取字符串: 从字符串左侧开始:Left(string,length) 从字符串右侧开始:Right(string,length) 从字符串中间开始:mid(string,start, ...
- XAF学习笔记之-多表头设计
空闲之余,看了下全英文的DEV 的XAF帮助文档,一半的英文我认识他,一半的英文他认识我,反正拆开成26个字母我全认识 不那么啰嗦了,先看效果 如何做:分以下几步 第一步:打开这个文件,这个文件就是X ...
- mysql.connector操作mysql的blob值
This tutorial shows you how to work with MySQL BLOB data in Python, with examples of updating and re ...
- (python)对象的引用
对比下列两个例子: 例子1: a=10 b=a a=a+2 print "a=",a,"b=",b 结果:a= 12 b= 10 a+2后,b仍然是10 例子2 ...