首页 > 其他分享 >jdk动态代理与cglib动态代理

jdk动态代理与cglib动态代理

时间:2024-07-12 17:42:54浏览次数:8  
标签:target Object 代理 接口 proxy cglib 动态 public

最近在用java实现redis,在使用动态代理时遇到了一点问题,即使用jdk动态代理(Invocationhandler)时,如果代理对象是一个接口的实现类,那么此时动态代理获取到的method对象是接口中的,而不是实现类的,现象是:我在实现类中对接口方法上新增了注解,但是此刻method反射获取不到注解信息,于是大概整理了一下这两者的区别

JDK 动态代理:获取的是接口中的方法信息,因此如果注解是在实现类上定义的,通过代理对象获取不到这些注解。

CGLIB 动态代理:获取的是目标类中的方法信息,因此可以获取到实现类上的注解。

JDK 动态代理

适用场景:

  • 目标类必须实现一个或多个接口。
  • 代理类会实现这些接口并代理方法调用。

优点:

  • 简单易用,直接基于 Java 反射机制。
  • 性能较好,适用于代理接口的场景。

缺点:

  • 只能代理接口中的方法,不能代理没有实现接口的类的方法。

示例:

java复制代码import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class DynamicProxy implements InvocationHandler {
    private final Object target;

    public DynamicProxy(Object target) {
        this.target = target;
    }

    public Object proxy() {
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return method.invoke(target, args);
    }
}

CGLIB 动态代理

适用场景:

  • 目标类没有实现接口,或者需要代理没有实现接口的方法。
  • 代理类是目标类的子类,通过生成子类来覆盖目标类的方法。

优点:

  • 可以代理没有实现接口的类。
  • 能代理类中的所有方法,包括那些没有在接口中定义的方法。

缺点:

  • 性能相对较差,因为需要生成子类。
  • 需要额外的 CGLIB 库。

示例:

java复制代码import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class CglibProxy implements MethodInterceptor {
    private final Object target;

    public CglibProxy(Object target) {
        this.target = target;
    }

    public Object proxy() {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(target.getClass());
        enhancer.setCallback(this);
        return enhancer.create();
    }

    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        return proxy.invokeSuper(obj, args);
    }
}

判断逻辑示例

你可以根据目标类的类型来选择适当的代理方式:

java复制代码public class ProxyFactory {
    public static <K, V> ICache<K, V> createProxy(Object target) {
        Class<?> clazz = target.getClass();

        // 判断是否是接口或者 Proxy 类
        if (clazz.isInterface() || Proxy.isProxyClass(clazz)) {
            return (ICache<K, V>) new DynamicProxy(target).proxy();
        }

        // 否则使用 CGLIB 动态代理
        return (ICache<K, V>) new CglibProxy(target).proxy();
    }

标签:target,Object,代理,接口,proxy,cglib,动态,public
From: https://www.cnblogs.com/awstan/p/18299076

相关文章

  • Vue遇到MathJax渲染的数学公式在翻页后仍然停留或无法动态加载
    Vue遇到MathJax渲染的数学公式在翻页后仍然停留或无法动态加载在使用Vue.js时,遇到MathJax渲染的数学公式在翻页后仍然停留的问题,通常是因为Vue的单页面应用(SPA)特性导致的DOM更新问题。MathJax通常在页面加载时渲染数学公式,但在SPA中,页面切换时可能不会重新渲染MathJax,导致......
  • 易优cms网站user功能:动态显示购物车、登录、注册、退出、会员中心的入口-Eyoucms
    user登录注册入口标签 [基础用法]名称:user功能:动态显示购物车、登录、注册、退出、会员中心的入口;语法:  {eyou:usertype='userinfo'}    <divid="{$field.htmlid}">       <ahref="{$field.loginurl}">登录</a>       <ahref="{$fi......
  • 动态内存管理
    为什么要有动态内存分配我们已经掌握的内存开辟⽅式有:如上图所示,有两种开辟空间的方法,一种是在栈空间上开辟一个整型变量,一种是在栈空间上开辟一个数组。但是上述的开辟空间的⽅式有两个特点:空间开辟⼤⼩是固定的。数组在声明的时候,必须指定数组的⻓......
  • 《代理选择与反爬虫策略探究:如何优化网络爬虫效率与稳定性》
    代理IP如何选以及常见反爬策略为什么需要代理?因为有的网站会封IP,用户如果没有登录,那IP就是身份标识,如果网站发现用户行为异常就非常可能封IP什么是代理IP就是让一个人帮你转交请求,帮你转交的人对面不熟,也就难以发现频繁请求的是你但是要注意我们只能使用高匿代理,透明代理(转交......
  • 动态规划的一种常见技巧
    动态规划是运筹学的一个分支,是求解决策过程最优化的过程。动态规划并不是一种算法,而是一种思想,或者说策略动态规划的思想就是将大问题分解成一个一个的小问题,聚焦到每个小问题并逐个击破,小问题解决了就没有大问题了我们以一个关于最长递增子序列问题为例,设想你有一个包含......
  • 基于预测与多样性保持机制的动态多目标进化算法研究(一) ——进化动态多目标优化算法框
    一、进化动态多目标优化算法框架(一)步骤进化动态多目标优化经过一段时间的发展,已经形成了相对成熟的动态多目进化算法的框架。一般地,动态多目标进化算法的步骤可以分为下面几步:第一步:随机初始化整个种群,设置算法运行需要的起始参数。第二步:环境检测:如果检测到环境发生了......
  • 经济学:动态模型平均(DMA)、动态模型选择(DMS)、ARIMA、TVP预测原油时间序列价格|附代
    全文链接:http://tecdat.cn/?p=22458最近我们被客户要求撰写关于动态模型平均的研究报告,包括一些图形和统计输出。本文提供了一个经济案例。着重于原油市场的例子。简要地提供了在经济学中使用模型平均和贝叶斯方法的论据,使用了动态模型平均法(DMA),并与ARIMA、TVP等方法进行比较简......
  • Python实战:拥有设闹钟功能的可视化动态闹钟的实现
    ✨✨欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨......
  • 为什么使用代理IP无法访问网站
    代理IP可以为用户在访问网站时提供更多的便利性和匿名性,但有时用户使用代理IP后可能会遇到无法访问目标网站的问题。这可能会导致用户无法完成所需的业务要求,给用户带来麻烦。使用代理IP时,您可能会因为各种原因而无法访问您的网站。以下是代理IP无法访问网站的一些常见原因:1、......
  • 为什么使用代理IP无法访问网站
    代理IP可以为用户在访问网站时提供更多的便利性和匿名性,但有时用户使用代理IP后可能会遇到无法访问目标网站的问题。这可能会导致用户无法完成所需的业务要求,给用户带来麻烦。使用代理IP时,您可能会因为各种原因而无法访问您的网站。以下是代理IP无法访问网站的一些常见原因:1、......