谈谈java的代理模式认识 三————CGLIB代理

接着上篇博客的代理模式,我们继续,上篇博客介绍了JDK的动态代理,但是JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,这样就存在一定的局限性。对于这种情况,我们采用CGLIB来实现。

一、CGLIB动态代理

cglib是针对类来实现代理的,其实现原理:CGLIB的底层采用ASM字节码生成框架,使用字节码技术生成代理,比使用反射生成代理的效果要高,是对指定的目标类生成一个子类,并覆盖其中方法实现增强。但是也有一点点不足,因为采用的是继承,所以不能对final修饰的类进行代理。

还是使用以前的代码,依然还是简单的三步来实现。第一:建立一个普普通通的业务类;第二:写CGLIB代理类;第三:写测试代码或者客户端调用。这里的不同是第一步中,我们不需要在建接口了,只是一个普普通通的java类。

看代码:

<span style="font-family:KaiTi_GB2312;font-size:18px;"> /**
     * 业务类(包含业务逻辑)
     *  即:委托类
     * @author Cassie
     */
    public class Account{      

        @Override
        public void queryAccount() {
            System.out.println("查询方法...");
        }      

        @Override
        public void updateAccount() {
            System.out.println("修改方法...");
        }      

    }</span>

然后,我们来写CGLIB代理类:

<span style="font-family:KaiTi_GB2312;font-size:18px;">import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;  

/**
 * 使用cglib动态代理
 * @author Cassie
 * 实现MethodInterceptor 接口
 */
public class CglibProxy implements MethodInterceptor {  

    //委托对象,运行时定类型
    private Object target;  

    /**
     * 创建代理对象
     *
     * @param target
     * @return
     */
    public Object getInstance(Object target) {
        this.target = target;
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(this.target.getClass());
        // 回调方法
        enhancer.setCallback(this);
        // 创建代理对象
        return enhancer.create();
    }  

    @Override
    // 回调方法
    public Object intercept(Object obj, Method method, Object[] args,
            MethodProxy proxy) throws Throwable {
        System.out.println("before");
        Object result = proxy.invokeSuper(obj, args);
        System.out.println("after");
        return result
    }  

}  </span>

最后写测试类调用

<span style="font-family:KaiTi_GB2312;font-size:18px;">public class TestCglib {  

    public static void main(String[] args) {
	//实例化代理
        CglibProxy cglib=new CglibProxy();
	//通过代理拿到对象
        Account account = (Account)cglib.getInstance(new Account());
        account.query();
    }
}</span>

通过以上代码,我们发现proxy.invokeSuper(obj,arg)是执行的关键。

使用CGLIB,需要实现 CGLib 给我们提供的 MethodInterceptor 实现类,并填充 intercept() 方法。方法中最后一个 MethodProxy 类型的参数 proxy,值得注意!CGLib 给我们提供的是方法级别的代理,也可以理解为对方法的拦截。我们直接调用 proxy 的 invokeSuper() 方法,将被代理的对象 obj 以及方法参数 args
传入其中即可。

至此,CGLIB代理也实现了。

时间: 2024-10-13 17:59:42

谈谈java的代理模式认识 三————CGLIB代理的相关文章

java 代理模式一: 静态代理

代理模式: 代理模式的作用:为其他对象提供一种代理以控制对 特定对象  的访问. 某种情况下,一个客户不想或者直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用:通过代理对象引用. 代理模式一般涉及到的角色: 抽象角色:声明真实对象和代理对象的共同接口.可以是一个抽象类或者一个接口. 代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便任何时候都能代替真实对象. 同时,代理对象可以在执行真实对象操作时,附加其他的操作,

AOP之代理模式(三)

JDK自从1.3版本开始,就引入了动态代理,JDK的动态代理用起来非常简单,但是它有一个限制,就是使用动态代理的对象必须实现一个或多个接口 .如果想代理没有实现接口的类可以使用CGLIB包.先来看看GCLIB的具体使用,然后再对应代码深入理解. 在使用CGLIB时需引入cglib-nodep-2.1_3.jar包. 先来一个基础类,注意,这里没有对应的接口. public class GreetingImpl { public void sayHello(String name) { Syste

C#设计模式之代理模式(三)

15.4 远程代理   远程代理(Remote Proxy)是一种常用的代理模式,它使得客户端程序可以访问在远程主机上的对象,远程主机可能具有更好的计算性能与处理速度,可以快速响应并处理客户端的请求.远程代理可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在.客户端完全可以认为被代理的远程业务对象是在本地而不是在远程,而远程代理对象承担了大部分的网络通信工作,并负责对远程业务方法的调用. 远程代理示意图如图15-5所示,客户端对象不能直接访问远程主机中的业务对象,只能采取间接访问的方式.远程

java 代理模式二:动态代理

java动态代理: java动态代理类位于java.lang.reflect包下,一般主要涉及两个类: 1.Interface InvocationHandler 该接口中仅定义了一个方法:Object invoke(Object proxy,Method method,Object[] args) 第一个参数obj一般是代理类,method是被代理的方法,如上例中的request(),  args是该方法中的参数数组,无参是为null 这个抽象方法在代理类中动态实现. 2.Proxy prot

java 责任链模式的三种实现

责任链模式 责任链模式的定义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系, 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止.这里就不再过多的介绍什么是责任链模式,主要来说说java中如何编写.主要从下面3个框架中的代码中介绍. servlet中的filter dubbo中的filter mybatis中的plugin 这3个框架在实现责任链方式不尽相同. servlet中的Filter servlet中分别定义了一个 Filter和Filter

设计模式学习之代理模式(Proxy)

一.代理模式的初衷 不想让客户端直接访问具体实现接口,客户端不应该直接访问具体实现,一般会涉及到以下四个对象 业务接口:定义客户端访问的接口,是实现类和代理类都需要实现的 实现类:实现了业务接口,真正的实现是在这里 代理类:同样实现了业务接口,一般都会关联一个实现类的实例,由它来调用实现类 客户端:顾名思义,使用者,与代理类打交道,甚至都不知道具体实现类的存在. 二.代理模式设计图 三.代理模式的简单实现代码 BizInterface.java package com.lipan.designp

Java的三种代理模式

1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法 举个例子来说明代理的作用:假设我们想邀请一位明星,那么并不是直接连接明星,而是联系明星的经纪人,来达到同样的目的.明星就是一个目标对象,他只要负责活动中的节目,而其他琐碎的事情就交给他的代理

java 代理模式(静态代理、动态代理、Cglib代理) 转载

Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法 代理模式最大的特点就是代理类和实际业务类实现同一个接口(或继承同一父类),代理对象持有一个实际对象的引用,外部调用时操作的是代理对象,而在代理对象的内部实现中又会去调

详解 Java 中的三种代理模式

代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.      这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法.      举个例子来说明代理的作用:假设我们想邀请一位明星,那么并不是直接连接明星,而是联系明星的经纪人,来达到同样的目的.明星就是一个目标对象,他只要负责活动中的节目,而其他琐碎