动态代理类使用到了一个接口InvocationHandler和一个代理类Proxy ,这两个类配合使用实现了动态代理的功能。
什么是动态代理呢?
普通代理类是指: 给每个具体类写一个代理类,以后要使用某个具体类时,只要创建它的代理类的对象,然后调用代理类的方法就实现。
可是如果现在有许多的具体类,那就需要有许多的代理类才可以,这样很显然不合适。所以动态代理就应运而生了,我们只要写一个类实现
InvocationHandler 并实现它的invoke方法,然后再用Proxy的工厂方法newProxyInstance()创建一个代理对象,这个对象同样可以实现对具体类的代理功能。
而且想代理哪个具体类,只要给Handler(以下代码中的Invoker)的构造器传入这个具体对象的实例就可以了。感觉是不是自己为该具体类造了一个代理类呢?
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; //接口类 计算接口 interface ICal { public int Cal(int a,int b); } // 加法实现 class ClassAdd implements ICal { @Override public int Cal(int a,int b){ System.out.println("ClassAdd!"); return a+b; } } // 减法实现 class ClassSub implements ICal { @Override public int Cal(int a,int b){ System.out.println("ClassSub!"); return a-b; } }
代理类实现 非常通用的实现方式:
//动态代理类,实现InvocationHandler接口 class DynamicProxy implements InvocationHandler { private Object target; public DynamicProxy(Object ac) { this.target = ac; } //动态生成代理对象 public Object getDynamicProxyObject(){ return Proxy.newProxyInstance(this.target.getClass().getClassLoader(),this.target.getClass().getInterfaces(),this); } @Override public Object invoke(Object proxy, Method method, Object[] arg) throws Throwable { //调用之前可以做一些处理 System.out.println("Method before!"); Object result= method.invoke(target, arg); //调用之后也可以做一些处理 System.out.println("Method after!"); return result; } }
调用方式
/** * 测试类 */ class DynamicProxyTest { public static void main(String[] args) { //创建加法类的代理对象 ICal calProxyObject= (ICal) new DynamicProxy(new ClassAdd()).getDynamicProxyObject(); //调用加法类的计算方法。 int add= calProxyObject.Cal(5,3); System.out.println(add); } }
Cglib动态代理
JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。
请参考
http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html