应用的原型为

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

JDK与CGlib动态代理的实现的更多相关文章

  1. 动态代理的两种方式,以及区别(静态代理、JDK与CGLIB动态代理、AOP+IoC)

    Spring学习总结(二)——静态代理.JDK与CGLIB动态代理.AOP+IoC   目录 一.为什么需要代理模式 二.静态代理 三.动态代理,使用JDK内置的Proxy实现 四.动态代理,使用cg ...

  2. Spring AOP中的JDK和CGLib动态代理哪个效率更高?

    一.背景 今天有小伙伴面试的时候被问到:Spring AOP中JDK 和 CGLib动态代理哪个效率更高? 二.基本概念 首先,我们知道Spring AOP的底层实现有两种方式:一种是JDK动态代理, ...

  3. 【java高级编程】JDK和CGLIB动态代理区别

    转载:https://blog.csdn.net/yhl_jxy/article/details/80635012 前言 JDK动态代理实现原理(jdk8):https://blog.csdn.net ...

  4. JDK、CGlib动态代理详解

    Java动态代理之JDK实现和CGlib实现(简单易懂)      一 JDK和CGLIB动态代理原理 1.JDK动态代理 利用拦截器(拦截器必须实现InvocationHanlder)加上反射机制生 ...

  5. JDK和CGLIB动态代理区别

    背景:虽然自己了解这两种代理的区别,但是面试时候还是答的很模糊,需要好好总结. 前言JDK动态代理实现原理(jdk8):https://blog.csdn.net/yhl_jxy/article/de ...

  6. JDK和CGLIB动态代理原理

    1.JDK动态代理利用拦截器(拦截器必须实现InvocationHanlder)加上反射机制生成一个实现代理接口的匿名类, 在调用具体方法前调用InvokeHandler来处理. 2.CGLiB动态代 ...

  7. JDK和CGLIB动态代理原理区别

    JDK和CGLIB动态代理原理区别 https://blog.csdn.net/yhl_jxy/article/details/80635012 2018年06月09日 18:34:17 阅读数:65 ...

  8. Spring框架中的JDK与CGLib动态代理

    JDK和CGLib动态代理区别 JDK动态代理:利用拦截器(拦截器必须实现InvocationHanlder)加上反射机制生成一个实现代理接口的匿名类, 在调用具体方法前调用InvokeHandler ...

  9. spring框架中JDK和CGLIB动态代理区别

    转载:https://blog.csdn.net/yhl_jxy/article/details/80635012 前言JDK动态代理实现原理(jdk8):https://blog.csdn.net/ ...

  10. jdk和cglib动态代理

    一.原理区别:java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理. 而cglib动态代理是利用asm开源包,对代理对象类的class文件加 ...

随机推荐

  1. java之JVM学习--简单理解编译和运行的过程之概览

    java代码编译流程图: java字节码执行由JVM执行引擎完成 Java代码编译和执行的整个过程包含了以下三个重要的机制: Java源码编译机制 类加载机制 类执行机制 Java源码编译机制 Jav ...

  2. 4.AOP原理模拟

    AOP   Aspect-Oriented-Programming    面向切面编程 a)是对面向对象的思维方式的有力补充 好处:可以动态的添加和删除在切面上的逻辑而不影响原来的执行代码 a)Fil ...

  3. (十三)r18 cpu id

    1.cpuid内核接口 lichee/linux-4.4/drivers/soc/sunxi/sunxi-sid.c int sunxi_get_soc_chipid(u8 *chipid) int ...

  4. wlan相关查询命令

    1.查看当前连接的设备 hostapd_cli all_sta

  5. Ubuntu系统---安装QQ

    使用Ubuntu很不方便,如果有什么消息的话,还要回到windows中查看.预想在Ubuntu上直接安装一个QQ,有网友说使用WebQQ发现老是掉线,于是这里安装QQ国际版. 首先,下载安装包. 这里 ...

  6. python_tkinter组件

    1.按钮 # 按钮 # bg设置背景色 btn = tkinter.Button(root,text = '按钮',bg = 'red') btn.pack() # fg设置前景色(文字颜色) btn ...

  7. Vue-项目重要配置

    Vue配置axios ''' 1)安装插件(一定要在项目目录下): >: cnpm install axios 2)在main.js中配置: import axios from 'axios' ...

  8. 题解 [AT2134] Zigzag MST

    题面 解析 我们先考虑一下加一条边(x,y,z)会成什么亚子: (还有很多边不画了...) 然后我们把这个图单独拿出来: 我们可以发现,对于最小生成树的贡献, 它是等价于下面这张图的(因为连通性一样) ...

  9. 诊断和修复Web测试记录器(Web Test Recorder)问题

    http://www.cnblogs.com/oscarxie/articles/1045430.html Database LoadTest2010 script C:\Program Files ...

  10. HTML JS 弹层后底部页面禁止滚动处理

    1.打开新页面时需要禁止鼠标滚轮,禁止页面滑动: 1 2 3 4 在调用显示层时加上这句js代码就可以了: document.documentElement.style.overflow = &quo ...