• 动态代理模式和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 }
  • 相关阅读:
    技术的极限(8): 集成与分离
    心智与认知(1): 反馈循环(Feedback loop)
    证明与计算(6): 身份认证与授权
    证明与计算(5): 从加密哈希函数到一致性哈希
    技术的极限(6): 密码朋克精神(Cypherpunk Spirit)
    翻译(3): NULL-计算机科学上最糟糕的失误
    工具(5): 极简开发文档编写(How-to)
    证明与计算(3): 二分决策图(Binary Decision Diagram, BDD)
    证明与计算(2): 离散对数问题(Discrete logarithm Problem, DLP)
    翻译(2): How to Write a 21st Century Proof
  • 原文地址:https://www.cnblogs.com/ChenJunHacker/p/4405385.html
Copyright © 2020-2023  润新知