cglib动态生成class文件以及方法区溢出
来源:互联网 发布:头戴游戏耳机推荐 知乎 编辑:程序博客网 时间:2024/05/21 05:44
cglib被hibernate用来动态生成po的字节码。CGLIB的底层是java字节码操作框架ASM。
今天简单看下cglib的用法。cglib的Enhancer说起来神奇,用起来一页纸不到就讲完了。它的原理就是用Enhancer生成一个原有类的子类,并且设置好callback到proxy, 则原有类的每个方法调用都会转为调用实现了MethodInterceptor接口的proxy的intercept() 函数。
package yuesef;import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;public class TT {public static void main(String ss[]) {test();}static void test() {while (true) {Enhancer e = new Enhancer();e.setSuperclass(OOMObject.class);//要生成OOMObject类的子类e.setUseCache(false);e.setCallback(new MethodInterceptor() {//设置callback,对原有对象的调用全部转为调用MethodInterceptor的intercept方法@Overridepublic Object intercept(Object obj, Method method,Object[] args, MethodProxy proxy) throws Throwable {System.out.println("Before invoke ");Object result = proxy.invokeSuper(obj, args);System.out.println("After invoke");return result;}});OOMObject ee = (OOMObject) e.create();ee.test();}}static class OOMObject {public void test() {System.out.println("invokinginginginging....");}}}
下面这段代码动态生成class加载到内存。并且例子还有一个目的,就是让java虚拟机的permgen溢出:
Caused by: java.lang.OutOfMemoryError: PermGen space
这么做的目的是演示,在java虚拟机中,方法区存放了类的相关信息,比如类名、访问修饰符、常量池、字段描述、方法描述等等。当加载到方法区的class太多的时候就可能会报出permgen溢出的错误。
--------------------------------------愤愤粉粉格格------------------------------------------
下面的代码,也是让permgen溢出,但是原因不同。
这段代码是jvm的运行时常量池溢出。String类的intern方法的意思是如果池中已经包含了这个string类型的字符串,则返回池中代表这个字符串的String对象。如果池中不存在,则放入池中。
package yuesef;import java.util.ArrayList;import java.util.List;public class TT {public static void main(String ss[]) {test();}static void test() {int i = 0;List list = new ArrayList();while (true) {String s = i++ + "";list.add(s.intern());}}}
- cglib动态生成class文件以及方法区溢出
- cglib动态生成class文件以及方法区溢出
- 输出cglib以及jdk动态代理产生的class文件
- JDK动态代理生成.class文件和cglib动态代理生成.class文件
- JDK动态代理生成.class文件和cglib动态代理生成.class文件
- Cglib 动态生成bean
- 利用cglib生成动态对象
- 使用ASM动态生成class文件
- Class文件格式实战:使用ASM动态生成class文件
- Class文件格式实战:使用ASM动态生成class文件
- java中如何使用asm动态的生成或修改一个class文件以及asm的架构思想
- java-动态代理-jdk代理、cglib代理、生成字节码文件.
- Cglib生成动态代理(有改动)
- cglib 生成动态代理类的机制
- CGLib 动态生成 类及实例
- Java 动态代理以及Cglib代理
- javassist动态生成class
- HelloAsm(三)使用ASM动态生成class文件
- paip.HTML文本框INPUT无法输入的解决
- 谷歌面试经历
- java中short s=s+1和s+=1的区别
- Eclipse 全屏插件
- 时尚快消品大行其道 高利润率堪比苹果公司
- cglib动态生成class文件以及方法区溢出
- VS2010 + OpenCV2.3配置
- 大数相乘,数组
- 【thinkphp3.x】thinkphp3.x快速入门基础
- 使用CMAKE链接外部的动态库时找不到库文件解决办法(/usr/bin/ld: cannot find lxxx)
- FireBug 使用方法 详解!
- sqlite3.7.4的第二轮学习
- 曾经的你
- iOS学习阶段总结-b20120920-动画转场