CGLib动态代理

使用JDK创建代理有一个限制,即它只能为接口创建代理实例,这一点可以从Proxy的接口方法newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler handler)中看得很清楚:第二个入参interfaces就是需要代理实现的接口列表。

CGLib采用底层的字节码技术,可以为一个类创建子类,在子类总采用方法拦截的技术拦截所有父类方法的调用并顺势织入横切逻辑。

简单使用

定义一个需要代理的类

package org.aming.cglib.demo.service;

public class UserService {

	public void loadUserByUserName(String username) {
System.out.println("我正在尝试查找用户:" + username + "的信息");
}
}

实现MethodInterceptor接口

package org.aming.cglib.demo.interceptor;

import java.lang.reflect.Method;
import java.util.Objects; import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy; public class CglibProxy implements MethodInterceptor { private Enhancer enhancer; public <T> T getProxy(Class<T> clazz) {
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
return (T)enhancer.create();
} public <T> T getProxy(T t) {
enhancer.setSuperclass(t.getClass());
enhancer.setCallback(this);
return (T)enhancer.create();
} public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
long begin = System.currentTimeMillis();
System.out.println(obj.getClass().getName() + "." + method.getName());
Object result = proxy.invokeSuper(obj, args);
long end = System.currentTimeMillis();
System.out.println("执行了" + (end - begin) + "毫秒");
return result;
} public CglibProxy() {
super();
this.enhancer = new Enhancer();
}
}

测试

package org.aming.cglib.demo.test;

import org.aming.cglib.demo.interceptor.CglibProxy;
import org.aming.cglib.demo.service.UserService; public class TestMain { public static void main(String[] args) {
CglibProxy proxy = new CglibProxy();
UserService userService = proxy.getProxy(UserService.class);
userService.loadUserByUserName("大明二代");
}
}

小结

由于CGLib采用动态创建子类的方式生成代理对象,所以不能对目标类中的final或private方法进行代理。

Java学习笔记--Cglib动态代理的更多相关文章

  1. Java学习笔记--JDK动态代理

    1.JDK动态代理     JDK1.3之后,Java提供了动态代理的技术,允许开发者在运行期创建接口的代理实例.JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和 ...

  2. Java Proxy和CGLIB动态代理原理

    动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询.测试框架的后端mock.RPC,Java注解对象获取等.静态代理的代理关系在编译时就确定了,而动态代理的代理关 ...

  3. Java学习笔记14--动态代理

    InvocationHandler接口 public interface InvocationHandler{ public Object invoke(Object proxy,Method met ...

  4. 【JVM学习笔记】动态代理

    基于JDK的动态代理例子如下 接口 Subject public interface Subject { public abstract void request(); } 实现类RealSubjec ...

  5. 8.3(java学习笔记)动态编译(DynamicCompiler)与动态运行(DynamicRun)

    一.动态编译 简单的说就是在运行一个java程序的过程中,可以通过一些API来编译其他的Java文件. 下面主要说动态编译的实现: 1.获取java编译编译器 2.运行编译器(须指定编译文件) 获取编 ...

  6. Java学习笔记——设计模式之四.代理模式

    To be, or not to be: that is the question. --<哈姆雷特> 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. 上代码: p ...

  7. java 笔记(3) —— 动态代理,静态代理,cglib代理

    0.代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口. 代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等. 代理类与委托类之间通常会存 ...

  8. Java学习笔记——动态代理

    所谓动态,也就是说这个东西是可变的,或者说不是一生下来就有的.提到动态就不得不说静态,静态代理,个人觉得是指一个代理在程序中是事先写好的,不能变的,就像上一篇"Java学习笔记——RMI&q ...

  9. java学习笔记13--反射机制与动态代理

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...

随机推荐

  1. Redis 初次见面

    目录 Redis 特性 使用场景 初次使用 安装(Linux) 配置 启动 redis 的 3 种方法 使用 redis 客户端 关闭 redis 服务 Redis 版本说明 引用 1 Redis 特 ...

  2. Apollo 10 — adminService 全量发布

    目录 UI 界面 Portal 服务 admin 服务 总结 1. UI 界面 2. Portal 服务 当我们点击上面的发布按钮的时候,调用的当然是 portal 的接口.具体代码如下: /** * ...

  3. ES5、ES2015、ECMAScript6(转载)

    阮一峰博客系列: http://es6.ruanyifeng.com/#README

  4. 4. 泛型_EJ

    第23条: 不要在新代码中使用原生态类型 声明中具有一个或多个类型参数的类或接口,就是泛型类或接口.每种泛型都定义一组参数化的类型,每个泛型都定义一个原生态类型.例如List<E>相对应的 ...

  5. C#如何通过属性名称反射出属性本身

    A a = new A(); Type t = typeof(A); var v1 = t.GetField("n").GetValue(a);//获取字段值,你的类A.n是字段, ...

  6. select&epoll

    内核空间和用户空间 现在操作系统都是采用虚拟存储器,那么对 32 位操作系统而言,它的寻址空间(虚拟地址空间,或叫线性地址空间)为 4G(2的32次方).也就是说一个进程的最大地址空间为 4G.操作系 ...

  7. pycharm最新code码,分享给大家

    最新的pycharm激活码,到明年11月份,一名努力的Python程序员 这俩天,在忙学校布置的小项目,给大家更新少了,我会慢慢补上的,努力学pycharm,有什么问题可以问我哦,我竭尽所能帮大家解答 ...

  8. Spring学习之旅(四)Spring工作原理再探

    上篇博文对Spring的工作原理做了个大概的介绍,想看的同学请出门左转.今天详细说几点. (一)Spring IoC容器及其实例化与使用 Spring IoC容器负责Bean的实例化.配置和组装工作有 ...

  9. Activity切换的时候生命周期的变化

    之前在做笔试题的时候遇到一个问题:Activity A切换到ActivityB时,A和B的生命周期变化. 事实上,它们的生命周期变化是这样的: 1.A的onPause()方法被执行. 2.B的onCr ...

  10. Python 一键上传下载&一键提交文件到SVN入基线工具

    一键上传下载&一键提交文件到SVN入基线工具   by:授客 QQ:1033553122 实现功能 1 测试环境 1 使用说明 1   注: 根据我司项目规则订制的一套工具,集成以下功能,源码 ...