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

    Cglib 动态代理

    Cglib 动态代理是针对代理的类, 动态生成一个子类, 然后子类覆盖代理类中的方法, 如果是private或是final类修饰的方法,则不会被重写。

    CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代理创建代理,但当要代理的类没有实现接口或者为了更好的性能,CGLIB是一个好的选择。

    CGLIB作为一个开源项目,其代码托管在github,地址为:https://github.com/cglib/cglib

    示例:

    需要代理的类:

    public class Engineer {
        // 可以被代理
        public void eat() {
            System.out.println("工程师正在吃饭");
        }
    
        // final 方法不会被生成的子类覆盖
        public final void work() {
            System.out.println("工程师正在工作");
        }
    
        // private 方法不会被生成的子类覆盖
        private void play() {
            System.out.println("this engineer is playing game");
        }
    }

    CGLIB 代理类:

    import net.sf.cglib.proxy.Enhancer;
    import net.sf.cglib.proxy.MethodInterceptor;
    import net.sf.cglib.proxy.MethodProxy;
    import java.lang.reflect.Method;
    
    public class CglibProxy implements MethodInterceptor {
        private Object target;
    
        public CglibProxy(Object target) {
            this.target = target;
        }
    
        @Override
        public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
            System.out.println("###   before invocation");
            Object result = method.invoke(target, objects);
            System.out.println("###   end invocation");
            return result;
        }
    
        public static Object getProxy(Object target) {
            Enhancer enhancer = new Enhancer();
            // 设置需要代理的对象
            enhancer.setSuperclass(target.getClass());
            // 设置代理人
            enhancer.setCallback(new CglibProxy(target));
            return enhancer.create();
        }
    }

    测试方法:

    public class CglibMainTest {
        public static void main(String[] args) {
            // 生成 Cglib 代理类
            Engineer engineerProxy = (Engineer) CglibProxy.getProxy(new Engineer());
            // 调用相关方法
            engineerProxy.eat();
        }
    }

    运行结果:

    ###   before invocation
    工程师正在吃饭
    ###   end invocation


    来源:代理模式-https://www.runoob.com/design-pattern/proxy-pattern.html
  • 相关阅读:
    mysql系列--基础知识
    微信开发(2)–获取access_token
    微信开发(1)–开发模式
    https协议 ssl协议以及证书生成
    ▲▲▲▲▲ Daodantou 小练习▲▲▲▲▲
    第十三章 模块[DDT书本学习 小甲鱼]【1】
    第十一章 类和对象[DDT书本学习 小甲鱼]【3】
    第十一章 类和对象[DDT书本学习 小甲鱼]【2】
    第十一章 类和对象[DDT书本学习 小甲鱼]【1】
    hexdump(b,step,sep,decimal) 和 server、client 端 [北极星]
  • 原文地址:https://www.cnblogs.com/ooo0/p/12176582.html
Copyright © 2011-2022 走看看