自己写的一个 CGBLIB 动态代理【原创】
CGLIB代理类,用CGLIB来实现一个代理类。大致原理描述如下:
1、使用Enhancer类来生成一个继续于被代理类的子类,此子类会重写被代理类(父类)中所有的非final的public方法;
2、当调用代理类的某个方法时实际上通过一个MethodInterceptor委托来间接调用的;
3、MethodInterceptor的intercept方法会对被代理类的方法进行增强(增强的逻辑是通过Interceptor接口来实现的)并调用被代理类(super class)的相关方法。
调用过程如下图:

CglibProxy类实现核心代理逻辑,并提供一个Interceptor接口供客户端来实现增强逻辑。
package proxy; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy; /**
* @author xfyou
*/
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public class CglibProxy<T> { private final Class<T> targetClass;
private final MethodInterceptor methodInterceptor; public static <T> CglibProxy<T> newInstance(Class<T> targetClass, Interceptor interceptor) {
return new CglibProxy<>(targetClass, new MethodInterceptor() {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
interceptor.before(obj);
Object invokeResult;
try {
invokeResult = proxy.invokeSuper(obj, args);
} catch (Throwable e) {
interceptor.exception(obj, e);
throw new InvocationTargetException(e);
}
interceptor.after(obj);
return invokeResult;
}
});
} @SuppressWarnings("unchecked")
public T createNewObj() {
return (T) createNewEnhancer().create();
} private Enhancer createNewEnhancer() {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(targetClass);
enhancer.setCallback(methodInterceptor);
return enhancer;
} public interface Interceptor { /**
* Do something before invoke the super class method
*
* @param obj Instances of proxied objects
*/
void before(Object obj); /**
* Do something after invoked the super class method
*
* @param obj Instances of proxied objects
*/
void after(Object obj); /**
* Do something when exception occurred when invoke the super class method
*
* @param obj Instances of proxied objects
* @param e Exception
*/
void exception(Object obj, Throwable e); } }
WorkProxy类用来对Work类进行代理,生成的是一个单例的代理类。
package proxy; import proxy.CglibProxy.Interceptor; /**
* @author xfyou
* @date 2019/10/15
*/
public class WorkProxy { private static Work proxyObject; private static Interceptor interceptor = new Interceptor() { @Override
public void before(Object obj) {
System.out.println("before");
} @Override
public void after(Object obj) {
System.out.println("after");
} @Override
public void exception(Object obj, Throwable e) {
System.out.println("exception");
} }; static {
proxyObject = CglibProxy.newInstance(Work.class, interceptor).createNewObj();
} public static Work get() {
return proxyObject;
} }
被代理的Work类如下:
package proxy; /**
* Work
*/
public class Work { public void doWork() {
System.out.println("Do work");
} }
测试代码:
package proxy; /**
* @author xfyou
* @date 2019/10/15
*/
public class Test { public static void main(String[] args) {
WorkProxy.get().doWork();
} }
自己写的一个 CGBLIB 动态代理【原创】的更多相关文章
- 手写实现JDK的动态代理
Person接口 package com.zhoucong.proxy.jdk; public interface Person { // 寻找真爱 void findlove(); } 人物实现类 ...
- 仿照everything写的一个超级速查 原创
http://files.cnblogs.com/files/jacd/%E8%B6%85%E9%80%9F%E6%9F%A5%E6%96%87%E4%BB%B6.zip 速度奇快无比,体积奇小无比, ...
- 设计模式 - 动态代理原理及模仿JDK Proxy 写一个属于自己的动态代理
本篇文章代码内容较多,讲的可能会有些粗糙,大家可以选择性阅读. 本篇文章的目的是简单的分析动态代理的原理及模仿JDK Proxy手写一个动态代理以及对几种代理做一个总结. 对于代理模式的介绍和讲解,网 ...
- Java动态代理:一个面包店的动态代理帝国
文章首发于[博客园-陈树义],点击跳转到原文大白话说Java动态代理:一个面包店的动态代理帝国 代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中, ...
- 实现一个简单的基于动态代理的 AOP
实现一个简单的基于动态代理的 AOP Intro 上次看基于动态代理的 AOP 框架实现,立了一个 Flag, 自己写一个简单的 AOP 实现示例,今天过来填坑了 目前的实现是基于 Emit 来做的, ...
- JDK动态代理
一.基本概念 1.什么是代理? 在阐述JDK动态代理之前,我们很有必要先来弄明白代理的概念.代理这个词本身并不是计算机专用术语,它是生活中一个常用的概念.这里引用维基百科上的一句话对代理进行定义: A ...
- Java-马士兵动态代理模式
Java-马士兵动态代理模式 模拟jdk的动态代理的实现原理, 这些东西没有必要写出来,写项目的时候一般用不上,主要是为了面试和理解原理: java动态代理有什么作用 作用非常大,在很多底层框架中都会 ...
- 09Spring_AOP介绍和java本身的动态代理以及cglib代理
Aspect Oriented Programming 面向切面编程 1. 业界 AOP 实际上 OOP (面向对象编程 ) 延伸 ---- OOP编程语言. AOP设计思想,下面给出一张AOP的设 ...
- 深入浅出Java动态代理
文章首发于[博客园-陈树义],点击跳转到原文深入浅出Java动态代理 代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中,更是有举足轻重的地位.代理 ...
随机推荐
- thinkPHP+LayUI 懒加载实现
html <div class="layui-container" id="container"> </div> js,要引入layui ...
- Filter和Listener
Filter: 1.概念: web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,做一些事. 过滤器的作用:一般用于完成一些通用的操作:登录验证.统一编码处理,敏感字符处理.... 2.快 ...
- ELK提高篇之Logstash
目录 二.Logstash 2.1.安装logstash 2.2.Logstash的工作原理解析 2.3.Logstash的配置和运行 2.4.Logstash实用举例 2.5.Logstash常用插 ...
- 浅谈Python设计模式 - 适配器模式
声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 从本篇便开始介绍结构型设计模式,而适配器设计模式便是该类设计模式的一种,那么什么 ...
- excel 大文件解析原理实现
问题 目前的excel 不像之前的excel了可以支持的数据量更大,可以支持支持1048576行,16384列. 之前使用poi读取,直接报错,使用excel 事件的方式读取,还有不少的bug,关键是 ...
- linux设备驱动程序--gpio控制
gpio驱动程序 上一章节linux设备驱动程序--创建设备节点章节主要介绍了linux字符设备驱动程序的框架,从这一章节开始我们讲解各种外设的控制,包括gpio,i2c,dma等等,既然是外设,那就 ...
- Httpd服务入门知识-Httpd服务常见配置案例之定义站点主页面及错误页面配置
Httpd服务入门知识-Httpd服务常见配置案例之定义站点主页面及错误页面配置 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.定义站点主页面 [root@node101.yi ...
- PAT 乙级 1023.组个最小数 C++/Java
题目来源 给定数字 0-9 各若干个.你可以以任意顺序排列这些数字,但必须全部使用.目标是使得最后得到的数尽可能小(注意 0 不能做首位).例如:给定两个 0,两个 1,三个 5,一个 8,我们得到的 ...
- 2019年杭电多校第二场 1002题Beauty Of Unimodal Sequence(LIS+单调栈)
题目链接 传送门 思路 首先我们对\(a\)正反各跑一边\(LIS\),记录每个位置在前一半的\(LIS\)中应该放的位置\(ans1[i]\),后一半的位置\(ans2[i]\). 对于字典序最小的 ...
- oracle安装11g以及建账号等等
Oracle 11g安装步骤详解 一.Oracle 下载 注意Oracle分成两个文件,下载完后,将两个文件解压到同一目录下即可. 路径名称中,最好不要出现中文,也不要出现空格等不规则字符. 官方下地 ...