实现一个Cglib代理Demo
Cglib动态代理采用的是创建目标类的子类的方式。优点:不用实现额外接口,只操作我们关心类,高性能。
package jesse.test; import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy; class Father{
public void sayHello(){
System.out.println("this is father");
}
} interface Person{
void speak();
void walk();
} class Student extends Father implements Person{
public void study(){
System.out.println("i am student.");
} @Override
public void speak() {
System.out.println("i am student ,i can speak");
} @Override
public void walk() {
System.out.println("i am student ,i can walk");
}
} class MyMethodInterceptor implements MethodInterceptor{
@Override
public Object intercept(Object obj, Method method, Object[] arg, MethodProxy proxy) throws Throwable {
System.out.println("Before: "+ method);
Object object = proxy.invokeSuper(obj, arg);
System.out.println("After: "+method);
return object;
} } public class MyCglibProxy {
public static void main(String[] args) {
//可以指定 CGLIB 将动态生成的代理类保存至指定的磁盘路径下
//System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY,"本地磁盘路径");
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(Student.class);
enhancer.setCallback(new MyMethodInterceptor());
Student student = (Student)enhancer.create();
student.sayHello();
student.speak();
student.walk();
student.study();
} }
/**
* 就是只能为接口中的方法完成代理,而委托类自己的方法或者父类中的方法都不可能被代理。
* CGLIB 应运而生,它是一个高性能的,底层基于 ASM 框架的一个代码生成框架,它完美的解决了 JDK 版本的
* 动态代理只能为接口方法代理的单一性不足问题
*
* Student 是我们需要代理的委托类型,结果生成的代理类就直接继承了委托类。
* 这一个小设计就完美的解决了 JDK 动态代理那个单一代理的缺陷,继承了委托类,就可以反射出委托类接口中的所有方法,
* 父类中的所有方法,自身定义的所有方法,完成这些方法的代理就完成了对委托类所有方法的代理。
*
* 说明:cglib生成代理是通过字节码生成的子类作为代理类,因此不能对private final方法代理;
*
* 比较:
* CGLib动态代理创建代理实例速度慢,但是运行速度快;JDK动态代理创建实例速度快,但是运行速度慢。如果实例是单例的,
* 推荐使用CGLib方式动态代理,反之则使用JDK方式进行动态代理。Spring的实例默认是单例,所以这时候使用CGLib性能高。
*
*/
<!-- cglib -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.2.5</version>
</dependency>
实现一个Cglib代理Demo的更多相关文章
- 实现一个JDK代理demo
JDK代理,非常简单地实现了动态代理(首先是实现对应的InvocationHandler:然后,以接口来为被调用目标构建代理对象,代理对象简介运行调用目标,并提供额外逻辑插入) 缺点:它是只能以接口为 ...
- Spring强制使用CGLIB代理事务
Spring强制使用CGLIB代理事务 springaopjdkreferenceclasspath Spring1.2: 将事务代理工厂[TransactionProxyFactoryBean] ...
- Spring AOP demo 和获取被CGLIB代理的对象
本文分为两部分:1)给出Spring AOP的一个例子(会使用CGLIB代理):2)给出获取被CGLIB代理的原始对象. 1.Spring AOP Demo 这部分参考了博文(http://www.v ...
- 动态代理(二)—— CGLIB代理原理
前篇文章动态代理(一)--JDK中的动态代理中详细介绍了JDK动态代理的Demo实现,api介绍,原理详解.这篇文章继续讨论Java中的动态代理,并提及了Java中动态代理的几种实现方式.这里继续介绍 ...
- java代理(静态代理和jdk动态代理以及cglib代理)
版权声明:本文为Fighter168原创文章,未经允许不得转载. 目录(?)[+] 说到代理,脑袋中浮现一大堆代理相关的名词,代理模式,静态代理,jdk代理,cglib代理等等. 记忆特别深刻 ...
- 动态代理+静态代理+cglib代理 详解
代理定义:代理(Proxy):是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 动态代理+静态 ...
- Spring框架系列(11) - Spring AOP实现原理详解之Cglib代理实现
我们在前文中已经介绍了SpringAOP的切面实现和创建动态代理的过程,那么动态代理是如何工作的呢?本文主要介绍Cglib动态代理的案例和SpringAOP实现的原理.@pdai Spring框架系列 ...
- 基于Spring AOP的JDK动态代理和CGLIB代理
一.AOP的概念 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的 ...
- jdk代理和cglib代理
1.jdk静态代理(静态代理和动态代理) 本质:在内存中构建出接口的实现类. 缺陷:只能对实现接口的类实现动态代理, 使用cglib可以对没有实现接口的类进行动态代理. 2.cglib动态代理 ...
随机推荐
- glib windows下编译
记录的比较粗糙,但是绝对可行的 一些小的瑕疵以后再解决吧 (android版本的过几天再贴,移植到android已经通过) msys+mingw包下载: http://sourceforge.net/ ...
- Python3 安装xlrd、xlwt、xlutils
Python版本3.4,装xlrd和xlwt和xlutils的时间:2017-09-07. 安装xlrd.xlwt.xlutils很简单,直接[pip install xlrd].[pip insta ...
- nodejs的包管理器npm和cnpm
http://www.ydcss.com/archives/18 3.npm介绍 3.1.说明:npm(node package manager)nodejs的包管理器,用于node插件管理(包括安装 ...
- 如何生成pyc/pyo/pyd文件
# 一.如何生成pyc/pyo文件 # 1.通过编写代码生成 import py_compile # 参数如下 ''' def compile(file, cfile=None, dfile=None ...
- Ubuntu系统进程管理笔记
前言 今天对前端服务器进行迁移,本来前端服务器就一台,都是放置前端静态文件的地方,应该是比较简单的.唯一的问题是由于Nginx需要给ie8浏览器个i同https访问支持,不得不对Nginx进行重新编译 ...
- [ Mariadb ] 通过HAProxy代理后端Mariadb实现负载均衡
一.本次环境架构图 由于公司内网服务器有限,所以后端采用Mariadb自带的mysql_multi模型实现多实例. mysql的多实例有两种方式可以实现,两种方式各有利弊. 1.使用多个配置文件启动不 ...
- selenium TestNG 依赖和忽略测试
依赖:通过使用Test 注释的dependsOnMethods={"verifyLogin"}子句,verifyAccountInfo 测试指定了它依赖verifyLogin()方 ...
- activiti-ui源码构建
修改数据库链接:
- (二)openvpn客户端配置
1)下载和安装openvpn客户端 下载连接:https://build.openvpn.net/downloads/releases/ 注意:这里下载连接使用国内的网已被强,我通过FQ下载 链接:h ...
- (4)java基础知识
一.注释 java的注释方法主要有三种 1.单行注释 // 2.多行注释 /* 内容 */ 3.文档注释 /** * * */ 这种方法注释用于生成一份API文档,主要说明 方法的功能.参数.返回值 ...