JAVA 动态代理与AOP编程(面向切面编程)
2015-05-30 19:07
771 查看
前奏:
问题:如果我们在编码中遇到三个代码块,在每个代码块中都有相同的一段代码,我们可能会考虑将相同的代码块重构成一个公用的方法,然后再这个代码块中分别调用这个方法,但是又出现一个问题 那就是这三个代码块又和这个特定方法耦合了。
那么什么才是最理想的状态:这三个代码块即可以执行该重构的方法,又无需在程序中,以硬编码的方法直接调用该方法;
下面看看怎么用动态代理的方式实现最终目的:
问题:如果我们在编码中遇到三个代码块,在每个代码块中都有相同的一段代码,我们可能会考虑将相同的代码块重构成一个公用的方法,然后再这个代码块中分别调用这个方法,但是又出现一个问题 那就是这三个代码块又和这个特定方法耦合了。
那么什么才是最理想的状态:这三个代码块即可以执行该重构的方法,又无需在程序中,以硬编码的方法直接调用该方法;
下面看看怎么用动态代理的方式实现最终目的:
package com.reflect; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; interface Human { void info(); void fly(); } class SuperMan implements Human { @Override public void info() { System.out.println("i am superman"); } @Override public void fly() { System.out.println("i belive i can fly!"); } } class MyInvocationHandler00 implements InvocationHandler { Object obj;//被代理类对象生命 public void setObject(Object obj) { this.obj = obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { HumanUtil util = new HumanUtil(); util.method00(); Object returnValue = method.invoke(obj, args);// 动态的方法,从切面的角度动态改变该方法,即中间的这个方法是可变的 util.method01(); return returnValue; } } class MyProxy { //动态的创建一个代理类的对象 public static Object getProxyInstance(Object obj) { MyInvocationHandler00 myInvocationHandler00 = new MyInvocationHandler00(); myInvocationHandler00.setObject(obj); return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj .getClass().getInterfaces(), myInvocationHandler00); } } class HumanUtil { public void method00() { System.out.println("this is method 00"); } public void method01() { System.out.println("this is mehtod 01"); } } public class TestAop { public static void main(String[] args) { SuperMan superMan = new SuperMan(); Human sm = (Human) MyProxy.getProxyInstance(superMan); sm.fly(); sm.info(); NikeClothProduct nike = new NikeClothProduct(); ClothProduct product = (ClothProduct) MyProxy.getProxyInstance(nike); product.product(); } }有错误之处,还请大家帮忙指教!3Q
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统