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
  • 相关阅读:
    Computer Vision: Algorithms and ApplicationsのImage processing
    LOJ6079「2017 山东一轮集训 Day7」养猫
    网络七层协议及其作用
    观察者模式深度剖析
    NIO 中的读和写
    NIO的通道和缓冲区
    NIO简介
    使用OutputStream向屏幕上输出内容
    对象的序列化
    PushBackInputStream回退流
  • 原文地址:https://www.cnblogs.com/ooo0/p/12176582.html
Copyright © 2011-2022 走看看