Java基础(十一) 代理: jdkProxy和cgLib

来源:互联网 发布:数据库设计遵循的原则 编辑:程序博客网 时间:2024/06/04 20:03

Java基础(十一) 代理: jdkProxy和cgLib

1、 jdkProxy:
针对对象:必须有接口的类
实现原理: 生成代理类: extends Proxy implements 接口 因为java是单继承,所以必须有接口
细说JDK动态代理的实现原理 –参考

这里写图片描述

// 服务接口: com.jdkProxy.IJdkServicepackage com.jdkProxy;public interface IJdkService {    public String getName();    public void method1();}// 服务类: com.jdkProxy.impl.JdkServiceImplpackage com.jdkProxy.impl;import com.jdkProxy.IJdkService;public class JdkServiceImpl implements IJdkService {    private String name;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public JdkServiceImpl() {    }    public JdkServiceImpl(String name) {        this.name = name;    }    @Override    public void method1() {        System.out.println("JdkServiceImpl -> method1");    }}// 代理类:com.jdkProxy.JdkProxypackage com.jdkProxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class JdkProxy implements InvocationHandler  {    private Object target;    public Object createProxy(Object target) {        this.target = target;        return Proxy.newProxyInstance(this.target.getClass().getClassLoader(),                 this.target.getClass().getInterfaces(), this);    }    @Override    public Object invoke(Object object, Method method, Object[] args) throws Throwable {        IJdkService jdkService = (IJdkService) target;        if ( !"".equals(jdkService.getName()) && jdkService.getName() != null ) {            System.out.println("fuck you ");            method.invoke(this.target, args);        } else {            System.out.println("shit shit ");        }        return null;    }}// 代理测试类: com.jdkProxy.test.JdkProxyTestpackage com.jdkProxy.test;import com.jdkProxy.IJdkService;import com.jdkProxy.JdkProxy;import com.jdkProxy.impl.JdkServiceImpl;public class JdkProxyTest {    public static void main(String[] args) {        JdkProxy jdkProxy = new JdkProxy();        System.out.println("无参构造函数");        IJdkService jdkService = (IJdkService)jdkProxy.createProxy(new JdkServiceImpl());        jdkService.method1();        System.out.println("有参构造函数");        IJdkService jdkService2 = (IJdkService)jdkProxy.createProxy(new JdkServiceImpl("zhangsan"));        jdkService2.method1();    }}// 测试结果无参构造函数shit shit 有参构造函数fuck you CGLibService -> method1

2、 CGLib:
针对对象: 类
实现原理: 创建类的子类
需要的jar包: asm-2.2.3,asm-commons-2.2.3,asm-util-2.2.3 ,cglib-nodep-2.1_3, cglib-full-2.0.2.jar

// 服务类: com.cglibProxy.CGLibServicepackage com.cglibProxy;public class CGLibService {    private String name;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public CGLibService() {    }    public CGLibService(String name) {        this.name = name;    }    public void method1() {        System.out.println("CGLibService -> method1");    }}// 代理类: com.cglibProxy.CGLibProxypackage com.cglibProxy;import java.lang.reflect.Method;import com.jdkProxy.IJdkService;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;public class CGLibProxy implements MethodInterceptor{    private Object target ;    /** 无参构造函数 */    public Object createProxy( Object target) {        this.target = target;        Enhancer enhancer = new Enhancer();        enhancer.setSuperclass(this.target.getClass());        enhancer.setCallback(this);        return enhancer.create();    }    /** 有参构造函数  这个方法可以使用也可以不使用 用上面的那个可以支持带参数的构造函数*/      public Object createProxy( Object target, Class<?>[] argumentsType, Object[] arguments) {        this.target = target;        Enhancer enhancer = new Enhancer();        enhancer.setSuperclass(this.target.getClass());        enhancer.setCallback(this);        return enhancer.create(argumentsType, argumentsType);    }    @Override    public Object intercept(Object object, Method method,             Object[] args, MethodProxy methodProxy)                     throws Throwable {        CGLibService cgLibService = (CGLibService) target;        if ( !"".equals(cgLibService.getName()) && cgLibService.getName() != null) {            System.out.println("fuck you ");            methodProxy.invoke(this.target, args);        } else {            System.out.println("shit shit ");        }        return null;    }}// 代理测试类: com.cglibProxy.test.CGLibProxyTestpackage com.cglibProxy.test;import com.cglibProxy.CGLibProxy;import com.cglibProxy.CGLibService;public class CGLibProxyTest {    public static void main(String[] args) {        CGLibProxy cgLibProxy = new CGLibProxy();        System.out.println("无参构造函数");        CGLibService cgLibService = (CGLibService)cgLibProxy.createProxy(new CGLibService());        cgLibService.method1();        System.out.println("有参构造函数");        CGLibService cgLibService2 = (CGLibService)cgLibProxy.createProxy(new CGLibService("zhangsan"));        cgLibService2.method1();    }}   // 测试结果无参构造函数shit shit 有参构造函数fuck you CGLibService -> method1
原创粉丝点击