java 基于接口代理(JDK)和基于类的代理(CGLIB)

来源:互联网 发布:依云软件破解 编辑:程序博客网 时间:2024/06/05 09:38
JDK基于接口代理

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;interface BookInterface {void addBook();void intercept();};public class BookImpl implements BookInterface {public void addBook() {System.out.println("dynamic@BookImpl#addBook");}public void intercept() {System.out.println("dynamic@BookImpl#intercept is intercepted...");}// 测试方法public static void main(String[] args) {BookProxy proxy = new BookProxy();BookInterface impl = (BookInterface) proxy.getInstance(new BookImpl());impl.intercept();}};/** *  * @projectName:ActiveMq * @packageName: activeMQ.topicMessage * @ClassName : BookProxy * @createBy :Test * @createDate :2013-2-24下午01:23:25 * @useFor : *  */class BookProxy implements InvocationHandler {/** * 委托类 */private Object target;public Object getInstance(Object target) {this.target = target;return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), this);}public Object invoke(Object obj, Method method, Object[] args)throws Throwable {System.out.println("Before Advice");if ("intercept".equals(method.getName())) {System.out.println("intercept method is intercepted");return null;}// 注意此处的参数是注入的target 而不是objObject result = method.invoke(target, args);System.out.println("After Advice");return result;}}


但是,JDK的动态代理依靠接口实现,如果有些类并没有实现接口,则不能使用JDK代理,这就要使用cglib动态代理了。
Cglib动态代理
JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。

Cglib动态类代理

import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;public class BookClass {/** * 业务方法 使用cglib则不需要额外定义接口 Description: <br> *  * @see */public void addBook() {System.out.println("cglib@BookClass#addBook");}// 测试public static void main(String[] args) {BookProxy proxy = new BookProxy();BookClass bc = (BookClass) proxy.getInstance(new BookClass());bc.addBook();}};/** *  * @projectName:ActiveMq * @packageName: activeMQ.topicMessage * @ClassName : BookProxy * @createBy :Test * @createDate :2013-2-24下午01:31:22 * @useFor : Cglib 动态代理类 类代理 *  */class BookProxy implements MethodInterceptor {/** * 委托类 */private Object target;public Object getInstance(Object target) {this.target = target;Enhancer en = new Enhancer();en.setSuperclass(target.getClass());en.setCallback(this);return en.create();}public Object intercept(Object obj, Method method, Object[] args,MethodProxy proxy) throws Throwable {System.out.println("Before Advice");// 注意此处的参数是注入的target 而不是objObject result = proxy.invoke(target, args);System.out.println("After Advice");return result;}};
0 0
原创粉丝点击