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
阅读全文
0 0
- Java基础(十一) 代理: jdkProxy和cgLib
- 深入浅出Spring(一) 代理模式(静态代理,jdkproxy,cglib)
- Java基础学习总结(109)——Jdk动态代理和cglib动态代理总结
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- N
- 纸牌+后缀数组
- 机器学习实战:TypeError: unhashable type: 'matrix'
- 移动开发者快速上手php接口开发
- Linux下开发-揭秘文件链接数
- Java基础(十一) 代理: jdkProxy和cgLib
- Mybatis入门级教程(二)
- spring的异步调用
- golf的23种设计模式
- cookie和session的关系和区别
- vb中sub main到底是个啥
- O
- How do I enable core dumps for everybody
- Halcon笔记