动态代理模式和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动态代理有什么作用 作用非常大,在很多底层框架中都会 ...
随机推荐
- Android根据文件路径加载指定文件
Android根据指定的文件路径加载指定文件格式(图片格式 png, gif,jpg jpeg)的文件相关信息的列表. 如图: 代码: public class Util { /**** * 计算文件 ...
- c++ 对象的内存布局
之前介绍过了普通对象比如系统自带的int等对象的对齐方式,在学习类型转换的时候遇到了自定义类型的继承体系中的downcast与upcast. 于是顺藤摸瓜,摸到了这里.发现还是 陈皓的博客里面写的最早 ...
- 关于display:flex
遇到了一个bug 就是display:flex 遇到的bug原型就是,项目容器的diaplay:flex ,一行项目五个,到最后一行只剩两个的时候 是两端对齐的,如果再添加的话 也就是两端各一个子 ...
- table 排序 添加 删除 等操作
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- MAC 安装 Protobuf
1.确认MAC装有g++.make.vim工具 2.安装make工具使用 brew install make 3.安装protobuf brew install protobuf 4.安装 ...
- js替换选中的文字
替换html中选中的文字 function replaceSelection() { if (window.getSelection) { var selecter = window.getSelec ...
- Ubuntu 试用Android L版本
Android L是最近google一个大更新的版本,目前google开发了android L的开发者预览版本,对于一个android 开发者来说很定是要下载下来体验一把,顺便也要了解一下Androi ...
- java8中CAS的增强
注:ifeve.com的同名文章为本人所发,此文在其基础做了些调整.转载请注明出处! 一.java8中CAS的增强 前些天,我偶然地将之前写的用来测试AtomicInteger和synchronize ...
- 一次诡异的TOMCAT启动故障的解决
该系统采用TOMCAT+SSH+Linux+Proxool连接池, 以前数据库是本地连接. 后换数据库远端连接,最近老是启动不了. 1.怀疑是proxool连接池没有自动断开后恢复.尝试解决,不是这个 ...
- 2016年iOS技术圈回顾
2016年同2015年一样,在我还没有做好心理准备的时候,一晃神就到了年底.年关将近,不知诸君心情如何,年初的规划实现了多少,来年的计划又是否已有了眉目.年过三十的Peak君感觉年关是越来越难过了,越 ...