文档章节

class is frozen

momisabuilder
 momisabuilder
发布于 2018/07/13 10:24
字数 490
阅读 497
收藏 0

javassit是一个处理java字节码的类库;CtClass是一个class文件的抽象表示。

1.动态生成.class文件

public static void main(String[] args) {
        //默认的类搜索路径
        ClassPool classPool = ClassPool.getDefault();
        //创建一个ctClass对象
        CtClass ctClass = classPool.makeClass("com.lwj.mom.base.javassist.Student");
        try {
            //添加age属性
            ctClass.addField(CtField.make("private int age;",ctClass));
            //添加setAge方法
            ctClass.addMethod(CtMethod.make("public void setAge(int age){this.age = age;}",ctClass));
            //添加getAge方法
            ctClass.addMethod(CtMethod.make("public int getAge(){return this.age;}", ctClass));
            //将ctClass转换成字节码并写入文件
            byte[] byteArray = ctClass.toBytecode();
            FileOutputStream output = new FileOutputStream("D:\\Student.class");
            output.write(byteArray);
            output.close();
            System.out.println("文件写入成功!!!");

        } catch (CannotCompileException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } 
    }

2.修改已经被jvm加载的.class文件

public static void main(String[] args) {
        //默认的类搜索路径
        ClassPool classPool = ClassPool.getDefault();
        //创建一个ctClass对象
        CtClass ctClass = classPool.makeClass("com.lwj.mom.base.javassist.Student");
        try {
            //添加age属性
            ctClass.addField(CtField.make("private int age;",ctClass));
            //添加setAge方法
            ctClass.addMethod(CtMethod.make("public void setAge(int age){this.age = age;}",ctClass));
            //添加getAge方法
            ctClass.addMethod(CtMethod.make("public int getAge(){return this.age;}", ctClass));
            //将ctClass转换成字节码并写入文件
            byte[] byteArray = ctClass.toBytecode();
            FileOutputStream output = new FileOutputStream("D:\\Student.class");
            output.write(byteArray);
            output.close();
            System.out.println("文件写入成功!!!");

            /*if(ctClass.isFrozen()){
                ctClass.defrost();
            }*/

            //这里用pool.get()去获取ctClass对象,表示默认JVM已经加载此类.
            ctClass = classPool.get("com.lwj.mom.base.javassist.Student");
            ctClass.addField(CtField.make("private String sex;", ctClass));
            ctClass.addField(CtField.make("private String name;", ctClass));

            byteArray = ctClass.toBytecode();
            output = new FileOutputStream("D:\\Student.class");
            output.write(byteArray);
            output.close();

            System.out.println("文件修改成功!!!!");

        } catch (CannotCompileException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (NotFoundException e) {
            e.printStackTrace();
        }
    }

发现报错,log如下

2.1 class is frozen(冻结class)原因

如果一个CtClass对象通过writeFile(),toClass()或者toByteCode()转换成class文件,那么javassist会冻结这个CtClass对象。后面就不能修改这个CtClass对象了。这样是为了警告开发者不要修改已经被JVM加载的class文件,因为JVM不允许重新加载一个类。

把这段代码打开,问题便得到了解决。 

/*if(ctClass.isFrozen()){
                ctClass.defrost();
            }*/

 

© 著作权归作者所有

momisabuilder

momisabuilder

粉丝 15
博文 67
码字总数 31440
作品 0
西安
后端工程师
私信 提问
django迁移遇到的mysql版本异常

迁移django报错: Traceback (most recent call last): File "manage.py", line 15, in executefromcommand_line(sys.argv) File "/usr/local/lib/python3.5/dist-packages/django/core/mana......

冰封心动
07/23
0
0
Django连接mysql时显示LookupError: No installed app with label 'admin'.是为什么

具体情况如下: "E:PycharmPyCharm 2018.3.5binrunnerw64.exe" C:UsersAdministratorPycharmProjectsuntitled2venvScriptspython.exe C:/Users/Administrator/PycharmProjects/untitled2/man......

Sam-Drake
04/26
2.2K
2
easyUI detailview 展开部分IE错位解决方案

红色部分为修改部分,设定显示部分高度 忽略JQuery的兼容问题 var detailview = $.extend({}, $.fn.datagrid.defaults.view, { render: function(target, container, frozen){ var state = ......

为梦而来
2015/10/22
1K
0
django使用python manage.py makemigrations命令不能生成数据库表

G:\pythondemo\myblog>python manage.py makemigrations Traceback (most recent call last): File "manage.py", line 22, in execute_from_command_line(sys.argv) File "C:\Program Files ......

snowfox008
2018/04/11
5.4K
5
django模型同步oracle报错缺失右括号

python版本:3.6.4 django版本 2.0 oracle 11g 执行python manage.py migrate时报错如下: C:\Python36\lib\site-packages\django\db\models\base.py:309: RuntimeWarning: Model 'books.pub......

胡巴520
2018/08/30
283
2

没有更多内容

加载失败,请刷新页面

加载更多

离线环境玩Docker-镜像篇

接上一篇。之前联网环境的Docker已经安装成功了,那么一切都好办,思路就是把Docker镜像保存为文件,然后放到不能联网的电脑上面,导入镜像即可。 第一步:导出Docker镜像,这里以showdoc为例...

RippleChan
14分钟前
6
0
Spring Boot + Jpa + Thymeleaf 综合实践(增删改查示例)

在前面课程中,我们学习了 Spring Boot Web 开发、JPA 数据库操作、Thymeleaf 和页面交互技术,这节课综合这些内容做一个用户管理功能,包括展示用户列表(分页)、添加用户、修改用户和删除...

zw965
15分钟前
7
0
学习WEB前端开发是选择自学还是去培训机构?

WEB前端开发是目前最火的行业之一,竞争很大,工资很高,未来发展也极好。 我做WEB开发有很长一段时间,现在经常看见大家在留言问我想转行学习WEB前端但是不知道是选择自学,还是选择培训。 ...

说雾
31分钟前
7
0
redis匹配key并设置过期时间命令

redis-cli keys 'session*' | xargs -I {} redis-cli expire {} 1296000

为何不可1995
33分钟前
3
0
单点登录针对 vue 单页面模式下的 hash 问题

由于 hash 模式下,#/ 后面的参数无法传递到后台。 hash、hashchange事件 1、hash即URL中"#"字符后面的部分。   ①使用浏览器访问网页时,如果网页URL中带有hash,页面就会定位到id(或nam...

jxlgzwh
34分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部