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 动态代理【原创】的更多相关文章

  1. 手写实现JDK的动态代理

    Person接口 package com.zhoucong.proxy.jdk; public interface Person { // 寻找真爱 void findlove(); } 人物实现类 ...

  2. 仿照everything写的一个超级速查 原创

    http://files.cnblogs.com/files/jacd/%E8%B6%85%E9%80%9F%E6%9F%A5%E6%96%87%E4%BB%B6.zip 速度奇快无比,体积奇小无比, ...

  3. 设计模式 - 动态代理原理及模仿JDK Proxy 写一个属于自己的动态代理

    本篇文章代码内容较多,讲的可能会有些粗糙,大家可以选择性阅读. 本篇文章的目的是简单的分析动态代理的原理及模仿JDK Proxy手写一个动态代理以及对几种代理做一个总结. 对于代理模式的介绍和讲解,网 ...

  4. Java动态代理:一个面包店的动态代理帝国

    文章首发于[博客园-陈树义],点击跳转到原文大白话说Java动态代理:一个面包店的动态代理帝国 代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中, ...

  5. 实现一个简单的基于动态代理的 AOP

    实现一个简单的基于动态代理的 AOP Intro 上次看基于动态代理的 AOP 框架实现,立了一个 Flag, 自己写一个简单的 AOP 实现示例,今天过来填坑了 目前的实现是基于 Emit 来做的, ...

  6. JDK动态代理

    一.基本概念 1.什么是代理? 在阐述JDK动态代理之前,我们很有必要先来弄明白代理的概念.代理这个词本身并不是计算机专用术语,它是生活中一个常用的概念.这里引用维基百科上的一句话对代理进行定义: A ...

  7. Java-马士兵动态代理模式

    Java-马士兵动态代理模式 模拟jdk的动态代理的实现原理, 这些东西没有必要写出来,写项目的时候一般用不上,主要是为了面试和理解原理: java动态代理有什么作用 作用非常大,在很多底层框架中都会 ...

  8. 09Spring_AOP介绍和java本身的动态代理以及cglib代理

    Aspect Oriented Programming 面向切面编程 1. 业界 AOP 实际上 OOP (面向对象编程 ) 延伸 ----  OOP编程语言. AOP设计思想,下面给出一张AOP的设 ...

  9. 深入浅出Java动态代理

    文章首发于[博客园-陈树义],点击跳转到原文深入浅出Java动态代理 代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中,更是有举足轻重的地位.代理 ...

随机推荐

  1. Vue Nginx反向代理配置 解决生产环境跨域

    Vue本地代理举例: module.exports = { publicPath: './', devServer: { proxy: { '/api': { target: 'https://mov ...

  2. service基础概念和操作

    sevice概念介绍 service的实现强烈依赖于kube-DNS组件 新版本k8s安装的是core-DNS 因为每个pod是有生命周期的 为了给客户端访问pod提供一个固定的访问端点 servic ...

  3. mysql 查询当天数据

    查询当天数据 select * from tab where FROM_UNIXTIME(fabutime, '%Y%m%d') = 20121217;   mysql TO_DAYS(date) 函 ...

  4. MongoDB 分片集群实战

    背景 在如今的互联网环境下,海量数据已随处可见并且还在不断增长,对于如何存储处理海量数据,比较常见的方法有两种: 垂直扩展:通过增加单台服务器的配置,例如使用更强悍的 CPU.更大的内存.更大容量的磁 ...

  5. ELK快速入门(五)配置nginx代理kibana

    ELK快速入门五-配置nginx代理kibana 由于kibana界面默认没有安全认证界面,为了保证安全,通过nginx进行代理并设置访问认证. 配置kibana [root@linux-elk1 ~ ...

  6. lvs+keepalived高可用负载均衡

    一.实验环境和网络拓扑图 本实验需要5台虚拟机,一台客户机,2台lvs调度器,两台web服务器. 客户机:192.168.0.6/24 lvs1:192.168.0.201/24 lvs2:192.1 ...

  7. nginx重试机制proxy_next_upstream

    nginx作为反向代理服务器,后端RS有多台服务器,上层通过一定机制保证容错和负载均衡. nginx的重试机制就是容错的一种 官方链接:http://nginx.org/en/docs/http/ng ...

  8. Jmeter中while循环逻辑控制器+配置元件计数器的用法

    一.在线程组下添加逻辑控制器While Controller 二.在逻辑控制器While Controller下添加Sample,BeanShell Sampler , 三.逻辑控制器While Co ...

  9. python3接口自动化:绕过验证码登陆

    import requests import json from time import sleep class Test: url= "http://www.cnblogs.com/&qu ...

  10. Diagnostic Viewer 显示空白

    MATLAB R2014a仿真出现错误后,查找错误时,Diagnostic Viewer 显示空白.网上查的一种解决方法.我的电脑是Windows7. 1.点击 所有程序>附件>记事本(以 ...