欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JDK与CGlib动态代理的实现

程序员文章站 2022-03-24 22:17:11
应用的原型为 执行者:房屋中介Agency(分为JDKAgency、CGlibAgency) 被代理对象:程序员Programmer 被代理对象的实现接口:租户Tenement(CGlibAgency时不需要实现接口) JDK动态代理:执行者 JDKAgency CGlib动态代理:执行者 CGli ......

应用的原型为

执行者:房屋中介agency(分为jdkagency、cglibagency)

被代理对象:程序员programmer

被代理对象的实现接口:租户tenement(cglibagency时不需要实现接口)

tenement 接口:
package com.suzao.spring.test;

/**
 * tenement
 * @description 租户
 * @param
 * @return
 * @author mc
 * @date 2018/12/28 16:44
 */
public interface tenement {

    /**
     * renthouse
     * @description 租房方法
     * @param []
     * @return
     * @author mc
     * @date 2018/12/28 18:51
     */
    void renthouse();
}
programmer 实现类
package com.suzao.spring.test;

/**
 * programmer
 * @description 程序员
 * @param
 * @return
 * @author mc
 * @date 2018/12/28 18:21
 */
public class programmer implements tenement {

    /**
     * renthouse
     * @description 租房方法
     * @param []
     * @return
     * @author mc
     * @date 2018/12/28 18:52
     */
    @override
    public void renthouse() {
        system.out.println("我是程序员,我在找房子!");
    }
}

jdk动态代理:执行者  jdkagency 

package com.suzao.spring.test;

import java.lang.reflect.invocationhandler;
import java.lang.reflect.method;
import java.lang.reflect.proxy;

/**
 * jdkagency
 * @description jdk房屋中介
 * @param
 * @return
 * @author mc
 * @date 2018/12/28 18:22
 */
public class jdkagency implements invocationhandler{

    //拿到被代理对象的引用
    private tenement target;

    public object gettenementproxy(tenement target){
        this.target = target;
        class clazz = target.getclass();
        //clazz.getinterfaces() 获取它的接口
        //重新动态生成一个class字节码
        //编译
        return proxy.newproxyinstance(clazz.getclassloader(),clazz.getinterfaces(),this);
    }

    @override
    public object invoke(object proxy, method method, object[] args) throws throwable {
        system.out.println("jdk房屋中介开始执行。。。");
        system.out.println("----------------------------");
        method.invoke(this.target,args);
        system.out.println("----------------------------");
        system.out.println("jdk房屋中介结束执行。。。");
        return null;
    }
}

cglib动态代理:执行者  cglibagency 

package com.suzao.spring.test;

import org.springframework.cglib.proxy.enhancer;
import org.springframework.cglib.proxy.methodinterceptor;
import org.springframework.cglib.proxy.methodproxy;

import java.lang.reflect.method;

/**
 * cglibagency
 * @description cglib 租房中介
 * @param
 * @return
 * @author mc
 * @date 2018/12/28 19:11
 */
public class cglibagency implements methodinterceptor{


    public object gettenmentproxy(class clazz){

        enhancer enhancer = new enhancer();

        //告诉cglib,生成的子类需要继承那个类
        enhancer.setsuperclass(clazz);

        //设置回调
        enhancer.setcallback(this);

        //加载到jvm中,并返回代理对象
        return enhancer.create();
    }

    @override
    public object intercept(object obj, method method, object[] args, methodproxy methodproxy) throws throwable {
        system.out.println("cglib房屋中介开始执行。。。");
        system.out.println("----------------------------");
        methodproxy.invokesuper(obj,args);
        system.out.println("----------------------------");
        system.out.println("cglib房屋中介结束执行。。。");
        return null;
    }
}

代理测试类 testproxy 

package com.suzao.spring.test;

/**
 * testproxy
 * @description 测试代理
 * @param
 * @return
 * @author mc
 * @date 2018/12/28 18:46
 */
public class testproxy {


    public static void main(string[] args) {

        //java动态代理是利用反射机制生成一个实现被代理对象的接口的匿名类,在调用具体方法前调用invokehandler来处理。

        //执行者 jdkagency
        //被代理对象 programmer
        //被代理对象实现的接口 tenement
        tenement  tenement= (tenement) new jdkagency().gettenementproxy(new programmer());
        tenement.renthouse();
        system.out.println("\n\n");
        
        //cglib动态代理利用asm开源包,对被代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
        //执行者 cglibagency
        //被代理对象 programmer
        programmer  programmer= (programmer) new cglibagency().gettenmentproxy(new programmer().getclass());
        programmer.renthouse();
    }
}

执行结果:

jdk房屋中介开始执行。。。
----------------------------
我是程序员,我在找房子!
----------------------------
jdk房屋中介结束执行。。。



cglib房屋中介开始执行。。。
----------------------------
我是程序员,我在找房子!
----------------------------
cglib房屋中介结束执行。。。

pom.xml中引用:

<dependency>
                    <groupid>org.springframework</groupid>
                    <artifactid>spring-core</artifactid>
                    <version>${org.springframework-version}</version>
                </dependency>
         <dependency>
            <groupid>org.springframework</groupid>
            <artifactid>spring-beans</artifactid>
            <version>${org.springframework-version}</version>
        </dependency>
        <dependency>
            <groupid>org.springframework</groupid>
            <artifactid>spring-aop</artifactid>
            <version>${org.springframework-version}</version>
        </dependency>
         <dependency>
            <groupid>org.springframework</groupid>
            <artifactid>spring-context</artifactid>
            <version>${org.springframework-version}</version>
        </dependency>