JDK动态代理和Cglib的动态代理

news/2024/7/5 1:35:03

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

最简单的是静态代理方法,即代理模式,这里就不多啰嗦了。。

重点说一下JDK的动态代理和Cglib的动态代理吧

先说JDK的,需要被代理的类需要有接口,否则无法实现

package proxy.dynamic;public interface IBook {void add();
}

实现接口的类如下

package proxy.dynamic;public class Book implements IBook {@Overridepublic void add() {System.out.println("Add Method!");}}

创建一个代理类,需要实现一个接口InvocationHandler接口,里面有一个invoke方法需要实现

同时创建一个生成实例的方法

package proxy.dynamic;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class BookProxy implements InvocationHandler{private Object target;public Object bind(Object target) {this.target = target;return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);//这里需要接口}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {Object result=null;System.out.println("Before");result=method.invoke(target, args);//执行方法System.out.println("After");return result;}}

接下来创建测试类

package proxy.dynamic;public class Test {/*** @param args*/public static void main(String[] args) {BookProxy bp = new BookProxy();IBook book = (IBook) bp.bind(new Book());book.add();}}

可以看到依次输出了Before,方法,After


下面说一下Cglib的代理,Cglib代理不需要原类实现接口,依赖Cglib和asm两个Jar包

需要代理的类如下

package cglib.proxy;public class Book {public void add() {System.out.println("Add Method!");}
}

创建一个代理类,实现MethodInterceptor接口,同时写一个生成实例的getInstance方法

package cglib.proxy;import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;public class CglibProxy implements MethodInterceptor{private Object target;public Object getInstance(Object target){this.target=target;Enhancer enhancer = new Enhancer();enhancer.setSuperclass(this.target.getClass());enhancer.setCallback(this);return enhancer.create();}@Overridepublic Object intercept(Object obj, Method method, Object[] args,MethodProxy proxy) throws Throwable {System.out.println("Before");proxy.invokeSuper(obj, args);System.out.println("After");return null;}}

接下来就是简单测试一下

package cglib.proxy;public class Test {/*** @param args*/public static void main(String[] args) {CglibProxy proxy = new CglibProxy();Book book=(Book) proxy.getInstance(new Book());book.add();}}

运行效果一样的

简单总结一下,JDK动态代理,需要实现一个接口InvocationHandler,要求被代理的对象必须有一个接口

Cglib代理需要实现MethodInterceptor接口,不需要被代理的类必须有接口

性能方法,参考其他文章,说JDK代理适合多例模式,而单例模式Cglib更好一些,因为Cglib是用底层的字节码技术生成实例,耗费时间较长,性能不如JDK动态代理。(有待验证。。)


转载于:https://my.oschina.net/eviltuzki/blog/523352


http://lihuaxi.xjx100.cn/news/245847.html

相关文章

滚动屏幕显示隐藏div_HTML结构-常用标签:a·img·table·form·input·iframe·div

学习目标:掌握html的结构,head与body的区别 掌握常用标签 掌握a标签,img标签 掌握table标签 掌握form标签,input标签 掌握iframe 和frameSet标签 掌握div标签互联网的三大基石互联网中的三大基石是什么?HTML:超文本标记语言 HTTP:超文本传输协议 URL:统一资源定位符…

如何更快速加载你的JS页面

确保代码尽量简洁 不要什么都依赖JavaScript。不要编写重复性的脚本。要把JavaScript当作糖果工具,只是起到美化作用。别给你的网站添加大量的JavaScript代码。只有必要的时候用一下。只有确实能改善用户体验的时候用一下。 尽量减少DOM访问 使用JavaScript访问DOM元…

Android APP全面屏适配技术要点

全面屏的概念 为什么先要解释一下全面屏,因为这个词在现在来讲就是一个伪命题。全面屏字面意思就是手机的正面全部都是屏幕,100%的屏占比。但是现在推出所谓“全面屏”手机的厂商没有一个能达到全面的。 那么下面来说一下Android开发领域对全面屏的理解和…

mgr未同步 mysql_MySQL Group Replication(多主同步复制MGR)

开启replication配置:server-id1 #标识服务器唯一log-binmysql-bin #二进制日志开启enforce_gtid_consistency ON #GTID模式是组复制的基础技术binlog-formatrow#必须是ROW模式gtid-modeON …

Java三大主流框架概述

Struts、Hibernate和Spring是我们Java开发中的常用关键,他们分别针对不同的应用场景给出最合适的解决方案。但你是否知道,这些知名框架最初是怎样产生的?我们知道,传统的Java Web应用程序是采用JSPServletJavabean来实现的,这种模…

Cacti Weathermap添加主机在线状态图示检测

Weathermap 中文名称翻译为 气象图weathermap版本支持:0.94及最新版1、首先添加气象图 图例像这样。编辑需要添加图例的气象图配置文件 (气象图配置文件默认在/var/www/html/plugins/weathermap/configs/ 目录中)其中 KEYPOS指定全局图例名称以及 图例位置和 图例标…

zookeeper脑裂

出现: 在搭建hadoop的HA集群环境后,由于两个namenode的状态不一,当active的namenode由于网络等原因出现假死状态,standby接收不到active的心跳,因此判断active的namenode宕机,但实际上active并没有死亡。此…

5 修改request对象变量_【总结】前端5大常见设计模式,代码一看你就懂!

前言今天主要介绍一下我们平常会经常用到的设计模式,设计模式总的来说有23种,而设计模式在前端中又该怎么运用呢,接下来主要对比较前端中常见的设计模式做一个介绍。设计模式的定义设计模式是在面向对象软件设计过程中针对特定问题的简洁而优…