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("我走了"); } }
浙公网安备 33010602011771号