当前位置: 移动技术网 > IT编程>开发语言>Java > JDK与CGlib动态代理的实现

JDK与CGlib动态代理的实现

2018年12月28日  | 移动技术网IT编程  | 我要评论

小婉和小娇243,延庆租房网,心灵传输者迅雷下载

应用的原型为

执行者:房屋中介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>

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网