黑马程序员:Java培训、Android培训、iOS培训、.Net培训

             JAVA反射-面向方面编程AOP

一、面向方面的需求

     有如下模型:

           

    需要统计客户登录时间、使用系统情况,或系统运行日记等信息时,我们就需要到AOP。

二、上述模型可转换为面向对象编程模型:即面向方面编程AOP

         

      客户对任何方法的调用都会重定向到处理器上,这样我们就实现对客户行为的统计。

三、实例代码

    1、技术要点:将系统功能(例如:日记、统计等信息)添加代理对象上

    2、目标类的实现

    public interface Advice{

        void beforeLog (Method method);

        void afterLog (Method method);

    }

 

    public class MyAdvice emplements Advice{

        public void beforeLog(Method method){  //打印调用方法的信息

            System.out.println(method.getName() + "-Advice-" + "beforeMethod");     

        }

        public void afterLog (Method method){{  //打印调用方法的信息

            System.out.println(method.getName() + "-Advice-" + "afterMethod");       

        }

    }

    3、袋里类的实现:获得代理对象

     class MyProxy{

        private static Object getProxy(final Object proxied, final Advice advice){

            return Proxy.newProxyInstance(

                              proxied.getClass().getClassLoader(),

                              proxied.getClass().getInterfaces(),

                              new InvocationHandler(){

                                  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{

                                      //....

                                      advice.beforeLog (method);

                                      Object retVal = method.invoke(proxiec, args);

                                      advice.afterLog (method);

                                      //....

                                      return retVal;

                                  }

                              }); 

        }

     }

3、main():客户调用

  Collection proxied = new ArrayList();

      Collection collectionProxy = (Collection)MyProxy.getProxy(proxied , new MyAdvice());

      collectionProxy.add("aaa");

collectionProxy.add("ccc");

collectionProxy.add("bbb");   

      collectionProxy.contains("ccc");