AOP是面向方面的编程,实现AOP的核心技术就是代理

JVM可以通过Proxy动态的生成类,但是动态生成的这个类必须实现一个或多个接口,如果这个类没有接口,那么JVM就不能动态生成类,这时就要靠CGLIB库动态生成了

下面是例子:

Proxy动态代理的思路:客户端Client调用一个代理,代理的构造方法接收一个InvocationHandler,客户端调用代理的各个方法,各个方法会将这个请求传递给刚才通过构造方法传进去的InvocationHandler对象,这个InvocationHandler对象又将请求分发给目标的相应方法

下面是代码:

 

 

在以后的开发过程中,产生对象的collection3的那段代码应该被封装为getProxy方法,具体如下:

private static Object getProxy(final Object target,final Advice advice) {
        Object objProxy = (Object)Proxy.newProxyInstance(
                target.getClass().getClassLoader(), 
                target.getClass().getInterfaces(), 
                new InvocationHandler(){
                    //这里定义一个目标
                    

                    @Override
                    public Object invoke(Object proxy, Method method,
                            Object[] args) throws Throwable {
                        // TODO Auto-generated method stub
                        advice.methodBefore(method);
                        //在目标上执行代理的那个方法
                        Object obj = method.invoke(target, args);
                        advice.methodAfter(method);
                        return obj;
                    }
                    
                }
        );
        return objProxy;
    }

上面的代码接收的对象时Object,所以那就是一个万能代码了。调用他的代码是:

    final Collection<String> list = new ArrayList<String>();
        
        //还有一种最简便的方法就是直接使用Proxy类里的newProxyInStrancec()
        //直接使用匿名内部类创建一个参数
        //InvocationHandler里的invoke方法有三个参数
        //分别是:代理对象,调用代理的方法名称,传给方法的值
        Collection collection3 = (Collection)getProxy(list,new MyAdvice());
        
        

在方法的内部类中访问方法中的局部变量时,必须加上final

Advice是一个接口,以后我们在实现通告或内容的时候,直接操作MyAdvice就可以了

Advice接口

package com.itproxy;

import java.lang.reflect.Method;

public interface Advice {
    //系统功能一般来说会有4个方法
    //方法执行之前,方法执行之后,方法执行前后,catch中
    //spring就是利用代理的,以后只需要将通告或内容写在MyAdvice里就可以了
    public void methodBefore(Method method);
    public void methodAfter(Method method);
    

}

MyAdvice.java

package com.itproxy;

import java.lang.reflect.Method;

public class MyAdvice implements Advice {
    private long beginTime;

    @Override
    public void methodBefore(Method method) {
        // TODO Auto-generated method stub
        //我们可以再执行目标的前后干一些其他的事情,比如下面
        //System.currentTimeMillis()返回的当前时间的毫秒
        System.out.println("我来了");
        beginTime = System.currentTimeMillis();
    }

    @Override
    public void methodAfter(Method method) {
        // TODO Auto-generated method stub
        long endTime = System.currentTimeMillis();
        System.out.println(method.getName()+"......"+(endTime-beginTime));
        System.out.println("我走了");
    }

}
posted on 2014-07-21 14:04  001渴望成功  阅读(278)  评论(0)    收藏  举报