zoukankan      html  css  js  c++  java
  • CGLIB动态代理

    JDK动态代理必须要提供接口才能使用,有些不能提供结果的环境只能采用第三方技术,如CGLIB,优势在于不需要提供接口,只要一个非抽象类就可以实现动态代理

    1.非抽象类:

    public class HelloWorldImpl 
    {
    
        public void sayHelloWorld() 
        {
            System.out.println("hello world.....");
        }
    
        public void sayBye() 
        {
            System.out.println("good bye.....");
        }
    
    }

    2. 实现动态代理

    public class CglibProxy implements MethodInterceptor
    {
        public Object getProxy(Class cls)
        {
            //增强类对象
            Enhancer enhancer = new Enhancer();
            //设置增强类
            enhancer.setSuperclass(cls);
            //定义代理对象为当前对象, 要求当前对象实现 MethodInterceptor方法
            enhancer.setCallback(this);
            //返回并生成代理对象
            return enhancer.create();
        }
    
        @Override
        public Object intercept(Object proxy, Method method, Object[] args, MethodProxy proxyMethod) throws Throwable {
            System.out.println("调用真实方法前");
            //Cg 反射调用真实对象方法
            Object obj = proxyMethod.invokeSuper(proxy, args);
            System.out.println("调用真实方法后");
            return obj;
        }
    
    }

    3.测试:

    public class CGTest {
    
        public static void main(String[] args) 
        {
            CglibProxy proxy = new CglibProxy();
            HelloWorldImpl obj = (HelloWorldImpl) proxy.getProxy(HelloWorldImpl.class);
            obj.sayHelloWorld();
            obj.sayBye();
        }
    }
    输出:
    调用真实方法前
    hello world.....
    调用真实方法后
    调用真实方法前
    good bye.....
    调用真实方法后

    JDK和CGLIB都是生成代理对象,制定代理逻辑类,而代理逻辑类只需要实现一个接口的一个方法,这个方法是代理对象的逻辑方法,他可以控制真实对象的方法。

  • 相关阅读:
    命名对象继承2-验证Open*命名对象安全属性的传递
    命名对象继承1-验证Create*命名对象安全属性的传递
    讨论c/c++计算小数的精度问题
    隐藏进程名
    一个函数重载问题
    02-Python基础之列表
    01-Python基础之字符串
    django 实用工具dj-database-url 快速配置数据库
    Gerrit安装配置
    关于数学的摘抄
  • 原文地址:https://www.cnblogs.com/daxiong225/p/9900503.html
Copyright © 2011-2022 走看看