当前位置:首页 > CN2资讯 > 正文内容

CGLib 动态代理cglib动态代理原理

13小时前CN2资讯

CGLib全称是Code Generation Library(https:///cglib),是一个第三方开源的代码生成包,功能很强大,性能很优越,许多开源框架如Spring、Hibernate、EasyMock都使用了这个包来实现动态代理。


Java提供的动态代理是通过实现业务接口来生成一个新的代理类,所以需要定义接口,没有业务接口就没办法生成代理类;CGLib动态代理可以解决这个问题,它不需要业务接口,它直接以委托类(目标类)为父类生成一个增强的子类(代理类),所以这种方式不需要接口,但有一个前提是目标类不能被final修饰,即目标类必须是可继承的。


除了动态生成代理类这能力之外,CGLib还能干很多事情,比如过滤目标类的某些方法不被代理等;另外在最新版本的CGLib库中也提供InvocationHandler接口和Proxy类,即CGLib同时提供了与Java动态代理一样的功能。


MethodInterceptor接口:调用业务方法可以使用Method参数或者MethodProxy参数,建议使用MethodProxy参数,性能比较快。

public Object intercept(Object obj, java.lang.reflect.Method method, Object[] args, MethodProxy proxy) throws Throwable;


简单代码示例:

package .delegate; public class SalaryService { public void raise(){ System.out.println("raise someone's salary"); } public void query(){ System.out.println("query someone's salary"); } } package .delegate; import java.lang.reflect.Method; import net.sf.cglib.proxy.Callback; import net.sf.cglib.proxy.CallbackFilter; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import net.sf.cglib.proxy.NoOp; public class CglibDynamicProxy implements MethodInterceptor { public Enhancer enhancer = new Enhancer(); private String name; public CglibDynamicProxy(String name) {  = name; } public Object newProxyInstance(Class cls) { enhancer.setSuperclass(cls); //设置回调实例 enhancer.setCallbacks(new Callback[]{this, NoOp.INSTANCE}); //设置回调过滤器 enhancer.setCallbackFilter(new CallbackFilter(){ public int accept(Method method) { return "query".equalsIgnoreCase(method.getName()) ? 1 : 0; } }); return enhancer.create(); } public Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { if (!"HR".equals(name)) { System.out.println(name + ", 没有权限进行此操作!"); return null; } Object result = methodProxy.invokeSuper(object, args); return result; } } package .delegate; import net.sf.cglib.proxy.Proxy; public class CGLibProxyTest { public static void main(String[] args) { test("HR"); test("Steve"); } private static void test(String name) { SalaryService s1 = getSalaryService(name); s1.raise(); s1.query(); } private static SalaryService getSalaryService(String name) { CglibDynamicProxy proxy = new CglibDynamicProxy(name); return (SalaryService) proxy.newProxyInstance(SalaryService.class); } }





    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/24296.html

    分享给朋友:

    “CGLib 动态代理cglib动态代理原理” 的相关文章

    中国电信CN2线路接线指南:快速搭建高效网络连接

    在当今信息化时代,网络已经成为企业运营和日常生活不可或缺的一部分。而对于追求高品质网络体验的用户来说,中国电信的CN2线路无疑是一个excellent选择。CN2线路以其高带宽、低延迟和高稳定性著称,广泛应用于企业、游戏服务器、视频传输等多个领域。对于许多用户来说,CN2线路的接线过程可能会显得复杂...

    探索日本V文化:从排球V联赛到Vtuber的多元化发展

    在谈到日本的多元化时,首先无法忽视的是“日本 v”这个词汇所涵盖的多个领域。它不仅代表了排球运动的一个新平台,也象征着现代金融科技,以及独特的二次元文化。这些领域虽然各自独立,但它们共同描绘出日本社会在多个层面上的文化与技术的融合。 1.1 日本排球V联赛 自2018年启幕以来,日本排球V联赛(V....

    选择最适合的泰国VPS解决方案,助力业务成功

    我一直对网络基础设施充满好奇,尤其是虚拟专用服务器(VPS)这一概念。VPS为用户提供了一种灵活且高效的网站托管解决方案,让我觉得非常迷人。而泰国VPS更是因其独特的地理位置和网络质量,成为了许多选择者的心仪之地。 什么是VPS呢?简单地说,VPS是一种通过虚拟化技术将物理服务器划分为多个独立的虚拟...

    AS4134是什么线路:深入解析中国电信的核心骨干网

    AS4134线路,大家也可以叫它163网络,这是中国电信的核心骨干网之一。聊到AS4134,首先让人想到的就是它在国内出海带宽上占据的重要地位。能够承载90%的电信业务负载,真的是一个不可小觑的网络。这条线路不仅是中国电信的主要骨干网,还成为了很多海外用户访问国内互联网资源的高性价比选择。我在租用香...

    IDC托管便宜还是公有云便宜?全面解析成本优势与选择指导

    在选择IT基础设施时,我发现IDC托管和公有云服务是两个普遍关注的选项。很多企业在进行服务器部署时都在思考“IDC托管便宜还是公有云便宜?”为了帮助大家更好地理解,我决定从几个关键方面进行深入分析。 IDC托管的价格构成 在开始探讨具体价格前,我们有必要理清IDC托管的价格构成。基本上,IDC托管费...

    Vultr Cloud Computer与High Frequency服务器的全面对比

    在云服务的世界中,Vultr无疑是一个备受瞩目的名字。它提供两种主要的云服务器类型:Vultr Cloud Compute和High Frequency服务器。这两种服务器各有其独特之处,适合不同类型的用户和使用场景。 首先,Vultr Cloud Compute是其最基础的产品,主要以高性价比为卖...