cglib

记一个EasyExcel的Bug

爱⌒轻易说出口 提交于 2020-02-28 04:45:06
问题 使用EasyExcel读取Excel文件,发现获取到的值为空 问题定位 最终定位问题是由于EasyExcel源码中ModelBuildEventListener类中使用了Cglib的BeanMap来做对象赋值 原因是Model中使用@Accessors(chain = true)导致的 解决方案 移除代码中的@Accessors(chain = true) 使用Builder方式代替@Accessors(chain = true) 参考文献 mica cglib 增强 读Excel时, Model使用了lombok.experimental.Accessors注解会导致读不到值 来源: oschina 链接: https://my.oschina.net/wangshuhui/blog/3171789

Java基础知识的27个点

被刻印的时光 ゝ 提交于 2020-02-28 03:22:26
1、JAVA中的几种基本数据类型是什么,各自占用多少字节。 2、String类能被继承吗,为什么 不能。在Java中,只要是被定义为final的类,也可以说是被final修饰的类,就是不能被继承的。 3、String,Stringbuffer,StringBuilder的区别。 4、ArrayList和LinkedList有什么区别。 简单的区别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 (LinkedList是双向链表,有next也有previous) 2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。 深度的区别: 1.对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是统一的,分配一个内部Entry对象。 2.在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。 3

Spring Boot的动态代理AOP原理

只愿长相守 提交于 2020-02-27 08:13:41
前言 Spring AOP使用了动态代理技术,动态代理在业界比较流行的实现方式有,CGLIB,Javassist,ASM等等。 Spring动态代理实现方式 Spring采用了JDK和CGLIB两种方式,我们一般都是接口,配实现类,对应这种方式Spring采用的代理方式是JDK代理,如果实现类没有使用接口,就一个实现类的话就采用CGLIB代理。 个人微信公众,经常更新一些实用的干货: 来源: oschina 链接: https://my.oschina.net/u/4115084/blog/3164110

7、配置类解析

自作多情 提交于 2020-02-27 07:24:05
1、全局流程解析 public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // Prepare this context for refreshing. prepareRefresh(); // Tell the subclass to refresh the internal bean factory. ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // Prepare the bean factory for use in this context. prepareBeanFactory(beanFactory); try { // Allows post-processing of the bean factory in context subclasses. postProcessBeanFactory(beanFactory); // Invoke factory processors registered as beans in the context. //

性能优于JDK代理,CGLib如何实现动态代理

早过忘川 提交于 2020-02-27 04:17:59
按照代理的创建时期,代理类可以分为两种。 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。 动态代理:在程序运行时,运用反射机制动态创建而成。 动态代理三种方式 动态代理实现有三种方式,jdk动态代理(基于接口),cglib动态代理(基于继承),javassist(hibernate中使用这种方式)实现动态代理。 JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢? 这就需要CGLib了。 cglib如何实现代理 Cglib是一个优秀的动态代理框架,它的底层使用ASM在内存中动态的生成被代理类的子类,使用CGLIB即使代理类没有实现任何接口也可以实现动态代理功能。 CGLib原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。 CGLib创建的动态代理对象性能比JDK创建的动态代理对象的性能高不少,但是CGLib在创建代理对象时所花费的时间却比JDK多得多,所以对于单例的对象,因为无需频繁创建对象,用CGLib合适,反之,使用JDK方式要更为合适一些。同时,由于CGLib由于是采用动态创建子类的方法,对于final方法,无法进行代理。 cgLib动态代理实例 下面演示一个动态代理的实例。 导入maven 依赖 cglib

架构师内功心法,干过中介干过快递的代理模式详解

*爱你&永不变心* 提交于 2020-02-27 03:26:53
一、代理模式的应用场景 在我们的生活中,经常会见到这样的场景,如:租售房中介、婚介、经纪人、快递等,这些都是代理模式的现实生活体现。代理模式(Proxy Pattern)是指为其它对象提供一种代理,以控制对这个对象的访问。代理对象在客户端和目标对象中间起到了中介的作用,使用代理模式主要有两个目的: 一是保护目标对象,二是增强目标对象。 代理模式的类图结构: Subject是顶层设计的接口,RealSubject是真实的对象,Proxy是代理对象,代理对象持有真实对象的引用,客户端Client调用代理对象的方法,同时也调用真实对象的方法,在代理对象前后增加一些处理。我们一想到代理模式,就会理解为 代码增强 ,其实就是在原本的代码逻辑前后增加一些逻辑,而使得调用者无感知。代理模式分为静态代理和动态代理。 二、代理模式的分类 2.1 静态代理 我们直接来举例说明静态代理,青年男女到了适婚的年龄,如果没有对象,周围的亲戚朋友总是张罗着要给某某某介绍对象,这个介绍对象相亲的过程,就是一种我们人人都有份的代理。来看代码实现: 顶层接口设计Person类: public interface Person { /** * 寻找伴侣 */ void lookForMate(); } 女儿要求找对象,实现Person接口: public class Daughter implements Person

Spring AOP Cglib 动态代理

我是研究僧i 提交于 2020-02-26 17:11:12
0、可以代理没有接口的实现类 1、被代理类 /** * 被代理类 */ public class Cat { public void cry() { System.out.println("喵喵喵"); } } 2、实现MethodInterceptor接口 import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; import java.lang.reflect.Method; /** * 实现MethodInterceptor接口 */ public class CatMethodInterceptor implements MethodInterceptor { /** * 生成方法拦截器 * @param o 要进行增强的对象 * @param method 拦截的方法 * @param objects 参数列表 * @param methodProxy 方法的代理 * @return * @throws Throwable */ @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy

SpringAOP知识点梳理

这一生的挚爱 提交于 2020-02-25 22:08:15
在前段时间面试时,曾多次被问到“对AOP你了解多少”这样的问题。以前工作中虽然有用过 Spring AOP,但由于没有系统得自学过,所以关于Spring AOP 这块,可以说是基础甚差。即使临时抱佛脚,凭借网上面试宝典中前人的总结,在面对面试官时,也仅仅说出“AOP是面向切面编程”、“运用了代理模式”云云。多次碰壁后,我意识到自己过于自信,没有系统概念,就无法在面试官前多说出一句有意义的回答。 最近我把《Spring实战第四版》关于AOP那章看了一遍,除了最后的“注入AspectJ切面”外,其他知识点,都简单地做了梳理。AspectJ切面,由于涉及到AspectJ 自有AOP语法,我暂时不准备补习,所以不做梳理。 我认为,关于 Spring AOP,可以从这几个问题开始: 什么是 AOP? AOP 要解决的问题是什么? 关于 AOP 的术语? Spring AOP 的实现方式? 一、什么是AOP? AOP,全称:Aspect Oriented Programming,意为面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。(此概念来自百度百科) AOP框架不只是定义在Spring意义下,还有很多其他的AOP框架。不同的 AOP框架可能在连接点模型上有强弱之分,例如:有些通知可以应用在字段修饰符级别,另一些则只支持与方法调用相关的连接点;除此之外

java的代理和cglib的代理

北城以北 提交于 2020-02-25 19:15:03
动态代理:随用随加载 1.基于接口的动态代理 使用jdk提供:Proxy 中的newProxyInstance()的方法 * 要求:被代理实现一个类,否则不能使用 * newProxyInstance()方法的参数 * ClassLoader 用于加载代理对象的字节码,要求和被代理对象使用相同的类加载器 * interfaces, 让代理对象和被代理对象具有相同的方法 * InvocationHandler 提供增强的代码 * 有一个invoke方法 * proxy 代理对象的引用 * method 当前执行的方法 * args 当前执行方法所需的参数,和被代理对象有相同的返回值 //给出了main方法 public static void main(String\[\] args) { final Iproducer iproducer=new Producer(); Iproducer proxy= (Iproducer)Proxy.newProxyInstance(iproducer.getClass().getClassLoader(), iproducer.getClass().getInterfaces(), new InvocationHandler() { public Object invoke(Object proxy, Method method,

spring的动态代理

我们两清 提交于 2020-02-25 18:58:51
动态代理类型 spring有两种动态代理,分别是JDK和cglib。 原理区别 java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。 cglib动态代理是利用asm包,先加载代理对象类的class文件,然后修改其字节码生成子类来处理。 代理策略 如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP。 如果目标对象实现了接口,可以强制使用CGLIB实现AOP。 如果目标对象没有实现接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换。 字节码区别 JDK动态代理只能对实现了接口的类生成代理,而不能针对类。 CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法。 因为是继承,所以该类或方法最好不要声明成final。 来源: oschina 链接: https://my.oschina.net/k8king/blog/3165624