zoukankan      html  css  js  c++  java
  • jdk代理和cglib代理

    1.jdk静态代理(静态代理和动态代理) 本质:在内存中构建出接口的实现类。

      缺陷:只能对实现接口的类实现动态代理,
      使用cglib可以对没有实现接口的类进行动态代理。

    2.cglib动态代理     本质:生成被代理对象的子类。

    静态代理:proxy_static包下的一个接口和两个实现类

    Subject 有两个实现类一个是真实类(RealSubject),一个是代理对象类(ProxySubject),分别重写Subject的eat()方法following:

    1 public class RealSubject implements Subject {
    2 
    3     public void eat() {
    4         System.out.println("real eat method begin~");
    5     }
    6     
    7 }
    RealSubject

    //两种方式,分别是: 将真实对象暴露出来的方法  &&  不将真实对象暴露出来的方法

     1 public class ProxySubject implements Subject{
     2     private RealSubject realSubject;
     3     public void eat() {
     4         System.out.println("ProxySubject method begin~");
     5         realSubject.eat();
     6         System.out.println("ProxySubject method end~");
     7     }
     8     public RealSubject getRealSubject() {
     9         return realSubject;
    10     }
    11     public void setRealSubject(RealSubject realSubject) {
    12         this.realSubject = realSubject;
    13     }
    14         //不将真实对象暴露出来
    15     /*Subject realSubject = new RealSubject();
    16     public void eat() {
    17         System.out.println("ProxySubject method begin~");
    18         realSubject.eat();
    19         System.out.println("ProxySubject method end~");
    20     }*/
    21 }
    ProxySubject
     1     @Test
     2     public void Proxy_Static(){
     3         //不将真实对象暴露出来的方法
     4 //        ProxySubject proxysubject = new ProxySubject();
     5 //        
     6 //        proxysubject.eat();
     7         
     8         //将真实对象暴露出来的方法
     9         RealSubject rs= new RealSubject();
    10         ProxySubject ps = new ProxySubject();
    11         ps.setRealSubject(rs);
    12         ps.eat();
    13         
    14     }
    测试

     jdk动态代理:

    proxy_dynamic包下的一个接口和一个实现类

    写法依然是最普通的写法,重点在测试类里面

    测试如下

     1 @Test
     2     public void Proxy_jdk_Dynamic(){
     3         final IUserDao dao =new UserDaoImpl();
     4         Object instancedao = Proxy.newProxyInstance(dao.getClass().getClassLoader(), dao.getClass().getInterfaces(),new InvocationHandler() {
     5             public Object invoke(Object proxy, Method method, Object[] args)
     6                     throws Throwable {
     7                 System.out.println("增强 begin~");
     8                 Object invoke = method.invoke(dao, args);
     9                 System.out.println("增强 end~");
    10                 return invoke;
    11             }
    12         });
    13         System.out.println(((IUserDao)instancedao).add());
    14     }

     cglib动态代理:

     测试如下:

     1     @Test
     2     public void Proxy_cglib_Dynamic(){
     3         final Dog dog = new Dog();
     4         Enhancer enhancer = new Enhancer();
     5         enhancer.setSuperclass(dog.getClass());
     6         enhancer.setCallback(new MethodInterceptor() {
     7             public Object intercept(Object proxy, Method method, Object[] arg2,
     8                     MethodProxy methodproxy) throws Throwable {
     9                 System.out.println("begin~");
    10                 Object invoke = method.invoke(dog, arg2);
    11                 System.out.println("end~");
    12                 return invoke;
    13             }
    14         });
    15         
    16         Dog dog2 =(Dog)enhancer.create();
    17         dog2.Say();
    18         
    19     }
  • 相关阅读:
    Smobiler实现手机弹窗
    在 ASP.NET Web API 中使用 Attribute 统一处理异常
    VMWare的网络模式说明
    Windows Server2008 IIS通过Nginx实现绑定多个https域名
    Error while Launching activity
    Android 动态渐变按钮
    mysql安装和配置详解以及Navicat连接失败问题
    selenium的基础学习
    使用Pandas.read_csv时出现OSError: Initializing from file failed
    sklearn 机器学习 Pipeline 模板
  • 原文地址:https://www.cnblogs.com/john69-/p/5944725.html
Copyright © 2011-2022 走看看