Cglib StackOverflowErrror
1.intercept 方法中的 Object o 是代理类对象System.out.println(o); 会循环调用toString();cglib生成的代码toString代码:
final String CGLIB$toString$2() {return super.toString();}public final String toString() {MethodInterceptor var10000 = this.CGLIB$CALLBACK_0;if (var10000 == null) {CGLIB$BIND_CALLBACKS(this);var10000 = this.CGLIB$CALLBACK_0;}return var10000 != null ? (String)var10000.intercept(this, CGLIB$toString$2$Method, CGLIB$emptyArgs, CGLIB$toString$2$Proxy) : super.toString();}var1000 始终不为空,所以一直调用intercept循环。
原来的类 toString 也被cglib intercept方法 代理了,
所以 在 intercept 方法中 调用 代理对象o.toStringintercetp => toString => intercept => toString => ......toString 被代理了 !!! 由此可知,最好不要在intercept中调用 o 对象的方法,
因为o 代理对象,所有的方法都被 intercept 代理了, 一调用就循环!!!2.也不能调用method.invoke 也有类似的错误,原因暂时未探。method 是原来未被代理类的方法,不是代理类的method3.调用 methodProxy.invokeSuper(o,objects); 是正确的!
package com.xy.annotaion.handler.interceptor;import com.xy.annotaion.handler.util.Pointer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;import java.lang.reflect.Method;/*** @author Dell*/
public class TestCglibMethodInterceptor implements MethodInterceptor {@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
// Pointer.lg("public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable");
// Object ret = methodProxy.invoke(o,objects);
// Pointer.lg("end");//errror o is proxy,so call toString stack overflow//
// Pointer.lg(o);
// System.out.println(o);Pointer.lg(method);Pointer.lg(objects);Pointer.lg(methodProxy);methodProxy.invokeSuper(o,objects);return "123";}
}
Cglib StackOverflowErrror相关推荐
- 支撑Java框架的基础技术:泛型,反射,动态代理,cglib
以Spring为例要想看明白他的源码需要彻底理解Java的一些基础技术泛型,反射同时对于一些高级技术例如动态代理,cglib和字节码技术也需要掌握,下面就按章节来一一说清楚这些技术的核心部分,最后手写 ...
- 支撑Spring的基础技术:泛型,反射,动态代理,cglib等
1.静态代码块和非静态代码块以及构造函数 出自尚学堂视频:<JVM核心机制 类加载全过程 JVM内存分析 反射机制核心原理 常量池理解> public class Parent {stat ...
- JDK动态代理和Cglib的动态代理
2019独角兽企业重金招聘Python工程师标准>>> 最简单的是静态代理方法,即代理模式,这里就不多啰嗦了.. 重点说一下JDK的动态代理和Cglib的动态代理吧 先说JDK的,需 ...
- cglib代理的使用
一.什么是CGLIB? 总的来说,无论是cglib.jdk动态代理又或者是aop面向切面编程,都运用到了一个最重要的设计模式--代理模式!万变不离其终,学好代理模式,打遍天下无敌手! cglib就是一 ...
- 面试官:说说Spring AOP、AspectJ、CGLIB ?它们有什么关系?
欢迎关注方志朋的博客,回复"666"获面试宝典 AOP(Aspect Orient Programming),作为面向对象编程的一种补充,广泛应用于处理一些具有横切性质的系统级服务 ...
- Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)
class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件,取出 ...
- 面试官:Spring AOP、AspectJ、CGLIB 都是什么鬼?它们有什么关系?
AOP(Aspect Orient Programming),作为面向对象编程的一种补充,广泛应用于处理一些具有横切性质的系统级服务,如事务管理.安全检查.缓存.对象池管理等. AOP 实现的关键就在 ...
- 你必须会的 JDK 动态代理和 CGLIB 动态代理
来自:ytao 我们在阅读一些 Java 框架的源码时,基本上常会看到使用动态代理机制,它可以无感的对既有代码进行方法的增强,使得代码拥有更好的拓展性.通过从静态代理.JDK 动态代理.CGLIB 动 ...
- 代理详解 静态代理+JDK/CGLIB 动态代理实战
1. 代理模式 代理模式是一种比较好理解的设计模式.简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对 ...
最新文章
- 如何理解Transformer论文中的positional encoding,和三角函数有什么关系?
- BZOJ 2208[Jsoi2010]连通数
- 用SwipeBackLayout让activity具有滑动返回的效果
- javascript调用dll_Blazor条码识别:Web中运行C#和JavaScript
- modbus rtu 协议转DLT645-2007和DLT645-1997电表协议转换器定制,
- MYSQL描述选课系统的问题与_mysql+php实现选课系统中遇到的问题及解决方法
- 在线求CR,你觉得我这段Java代码还有优化的空间吗?
- 人与人之间交往最重要的是什么?
- JDBC连接效率问题
- 智能优化算法:猫群优化算法-附代码
- 我是如何从蛋壳的虎口里维权的?
- WAP PUSH解析(1)——SMS PDU编码
- 华为手机android怎么解锁,怎么查看华为手机解锁
- 奇偶校验方法(韦根协议)
- python数据可视化之Matplotlib
- 现代计算机系统必须配置的核心,第一章 计算机系统概述
- P - Balanced Stone Heaps
- 简易单片机制作频率计
- 单片机的c语言ppt,第9章-单片机的C语言编程.ppt
- 搞一下CP AUTOSAR 入门 | 07 CP AUTOSAR ComM 详解