美文网首页Java 杂谈程序员我爱编程
Java代理模式之CGLIB动态代理

Java代理模式之CGLIB动态代理

作者: BestbpF | 来源:发表于2018-08-20 09:47 被阅读32次
了解什么是动态代理模式,可参考Java设计模式之代理模式

简介

前面我们了解了JDK动态代理技术,发现其真实对象必须提供接口才可以使用。在一些不提供接口的环境中,只能采用一些别的第三方技术,比如CGLIB动态代理。它的有事在于不需要提供接口,只要一个非抽象类就可以实现动态代理。

  • 实现代理逻辑的类需要实现net.sf.cglib.proxy.MethodInterceptor接口
  • 下面示例的具体代码可到cglib动态代理中下载。
  • 实验需要引入CGLIB jar包
   <dependency>
      <groupId>cglib</groupId>
      <artifactId>cglib</artifactId>
      <version>2.2.2</version>
    </dependency>

示例

【真实对象类】

public class HelloGod {
    private String name;

    public HelloGod(String name){
        this.name = name;
    }

    public void helloGod(){
        System.out.println("hello " + name);
    }
}

【动态代理绑定和代理逻辑实现】

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 CglibProxyExample implements MethodInterceptor {

    /**
     * @param cls Class类
     * @return Class的CGLIB代理对象
     */
    public Object getProxy(Class cls, Class[] argumentTypes, Object[] arguments){
        //CGLIB enhancer增强类对象
        Enhancer enhancer = new Enhancer();
        //设置增强类型
        enhancer.setSuperclass(cls);
        //定义代理对象为当前对象,要求当前对象实现MethodInterceptor方法
        enhancer.setCallback(this);
        //生成并返回代理对象
        return enhancer.create(argumentTypes ,arguments);
    }

    /**
     * @param proxy 代理对象
     * @param method 方法
     * @param args 方法参数
     * @param methodProxy 方法代理
     * @return 代理逻辑返回
     * @throws Throwable 抛出异常
     */
    @Override
    public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        System.err.println("调用真实对象前");

        //CGLIB反射调用真实对象方法
        Object result = methodProxy.invokeSuper(proxy, args);

        System.err.println("调用真实对象后");

        return result;
    }
}

【测试】

public class TestCglibProxy {

    public static void main(String[] args) {
        CglibProxyExample cglibProxyExample = new CglibProxyExample();
        Class[] argumentTypes = new Class[]{String.class};
        Object[] arguments = new Object[]{"baipengfei"};
        HelloGod helloGod = (HelloGod) cglibProxyExample.getProxy(HelloGod.class, argumentTypes ,arguments);
        helloGod.helloGod();
    }
}

相关文章

  • java动态代理(JDK和cglib)(转载自http://ww

    java动态代理(JDK和cglib) JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是...

  • 设计模式之代理

    设计模式之代理模式 一、定义 在Java中代理的实现一般分为三种:JDK静态代理、JDK动态代理以及CGLIB动态...

  • Java 代理

    静态代理 动态代理 JDK 提供的Proxy CGLib cglib | GitHub 参考文章 Java的三种代理模式

  • 源码基础 -- 动态代理(2)

    再看java动态代理之Cglib动态代理,早期大家选择Cglib主要是因为Cglib底层采用ASM字节码生成框架,...

  • 六大原则 动态代理

    参考 六大原则 代理模式 介绍了三种代理:静态代理、Proxy、cglib java 动态代理详解介绍了动态代理具...

  • 代理

    《转》JAVA动态代理(JDK和CGLIB) 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接...

  • 设计模式

    单例模式 代理模式 静态代理 jdk动态代理 cglib动态代理 工厂模式 适配器模式 建造者模式 观察者模式

  • java设计模式之代理

    概述 java代理模式分为三种 静态代理 动态代理 Cglib代理 作用:给某一个对象提供代理对象,并由代理对象控...

  • 动态代理的两种方式

    静态代理就不说了,基本用到的都是动态代理。 Java中动态代理有JDK动态代理和CGLIB动态代理。 JDK代理的...

  • 设计模式~代理模式

    学习代理模式内容: ★ 静态代理、 ★ 动态代理(JDK动态代理、CGLIB动态代理)、 ★ 拦截器的原理和日志记...

网友评论

    本文标题:Java代理模式之CGLIB动态代理

    本文链接:https://www.haomeiwen.com/subject/btshiftx.html