2019独角兽企业重金招聘Python工程师标准>>>

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();}*/

转载于:https://my.oschina.net/momisabuilder/blog/1845775

class is frozen相关推荐

  1. torch The “freeze_support()” line can be omitted if the programis not going to be frozen to produce

    1.The "freeze_support()" line can be omitted if the programis not going to be frozen to pr ...

  2. 成功解决File frozen importlib._bootstrap, line 219, in _call_with_frames_removed ImportError: DLL lo

    成功解决File "frozen importlib._bootstrap", line 219, in _call_with_frames_removed ImportError ...

  3. 论文浅尝 | Multimodal Few-Shot Learning with Frozen Language Models

    笔记整理:李磊,浙江大学硕士,研究方向为自然语言处理 链接:https://arxiv.org/abs/2106.13884 动机 大规模的自回归语言模型(如GPT)在预训练阶段学习到了大量的知识,具 ...

  4. Solving environment: failed with initial frozen solve.Retrying with flexible solve

    Solving environment: failed with initial frozen solve.Retrying with flexible solve 用conda装paddle的时候出 ...

  5. IO is frozen on database xxx, No user action is required

    最近遇到一起关于"I/O is frozen on database xxx. No user action is required. However, if I/O is not resu ...

  6. Tasker to stop Poweramp control for the headset while there is an incoming SMS - frozen

    If you usually like to use Poweramp or any other media player to enjoy the music with headset plugge ...

  7. 移动开发框架--------基于腾讯手Q样式规范Frozen UI

    原文:http://www.cnblogs.com/shanyou/p/4152981.html Frozen UI是一个开源的简单易用,轻量快捷的移动端UI框架.基于手Q样式规范,选取最常用的组件, ...

  8. Elastic Searchable snapshot功能初探 三 (frozen tier)

    文章目录 演示思路 准备数据 创建快照仓库与快照 关联快照仓库与快照 mount searchable snapshot 挂载选项 full_copy shared_cache 测试可搜索快照 总结 ...

  9. Elasticsearch 7.9 之 Frozen indices

    Elasticsearch 索引在内存中保留了一些数据结构,使您可以高效地搜索它们并对其进行索引.如果索引很多,则这些数据结构所需的内存可能总计很大.对于经常搜索的索引,最好将这些结构保留在内存中,因 ...

  10. Pytorch报错:“freeze_support()“ line can be omitted if the program is not going to be frozen(已解决)

    报错提示: 运行 pytoch 测试代码时,出现如下报错: model [TestModel] was created liu yaxin 21 Traceback (most recent call ...

最新文章

  1. Tiny4412 Android5.0 定制:编译生成img后如何删除原厂的apk
  2. kafka笔记3(生产者)
  3. 人人都能做游戏!3D次世代CE云端引擎发布
  4. 微信小程序封装的Promise工具类 ES6语法
  5. 会员管理系统c语言,路西牌会员管理系统。
  6. 快捷关闭win8中的应用页面---解决方法
  7. DBeaver连接mysql驱动下载失败怎么办?
  8. 字符数组的ss.toString()和new String(ss)的问题
  9. arcgis 视频教程 ArcGIS Pro 从0到1
  10. vs2012c语言参考手册,visualstudio2012教程
  11. dell服务器怎么看故障信息,DELL服务器故障码详解
  12. 盘点14个因安全事故引咎辞职的高管领导
  13. 清华大学计算机学院2019冬令营,清华大学2019人文社科冬令营初审结果公布
  14. 【acwing】166. 数独****(DFS)
  15. ESP32-C3 flash encryption secure boot
  16. c语言中a-这个作用是什么,c语言中a*=y什么意思?
  17. psu计算机测试,「电脑维修」电源的检测(使用电源测试器)
  18. FIX三天日记-FIX简介
  19. bootstrap5基本使用
  20. html5css3选择题,web前端技术(HTML5+CSS3)答案试题题目及答案,期末考试题库,章节测验答案...

热门文章

  1. 最全的西安小吃了,别胡流口水啊!
  2. 如何取消文件的默认打开方式:
  3. Hacmp 5.1 配置手册---牛新庄(1)
  4. Nagios服务器端配置文件详解
  5. 视频教程-AI基础实战视频课程(海报书籍、多媒体设计、UI界面设计)-其他
  6. 《医学成像原理》——4.超声成像的知识总结
  7. JAVA实现数据库数据导入/导出到Excel(POI)
  8. matlab画傅立叶变换后相位谱,对一幅图像进行傅里叶变换后,包含频谱(也叫幅度谱)和相位谱两部分,请问那一部分更重要?...
  9. excel-批量在指定列中以关键词查找对应信息-示例:从数据源A 中查到对应信息填入B表
  10. 分布式 Session 一致性解决方案