当前位置: 首页 > news >正文

javassit使用过程的坑

https://segmentfault.com/a/1190000044154053

https://blog.csdn.net/Kingairy/article/details/104003524

经过不断的试错和研究,总结如下:

以CtMethod#setBody 方法为例

  1. 不要在代码中使用范型,哪怕是定义List<Object>这样基础范型,这样定义会报错([source error] bad field access 或者 [source error] bad filed access)
  2. 不支持增强for循环,否则会报错( [source error] ; is missing),可以使用迭代器来代替
  3. 使用类的全限定名,不管是基础类型还是其他类(别忘了异常类)
  4. javassist不支持基本类型的自动解包,如 boolean 与 Boolean、Int与Integer 是不同的,这个时候就需要手动进行解包了。
    public List<ActionValue> execute(Context context){ boolean isdebug=false; if(this.getDebug()!=null){ isdebug=this.getDebug(); //由于getDebug()返回的是包装类型,如此赋值代码编译没问题但运行时会报错,应使用 this.getDebug().booleanValue() } } public Boolean getDebug() { return debug; }

    上面的代码是布尔类型的。

    public List<ActionValue> execute(Context context){ Map rowMap=new HashMap(); int rowNumber=this.getRowNumber(); if(rowMap.containsKey(rowNumber)){ rowItem=rowMap.get(rowNumber); }else{ rowItem=new RowItemImpl(); rowItem.setRowNumber(rowNumber); rowMap.put(rowNumber, rowItem); } } public int getRowNumber() { return rowNumber; }

    上面的代码稍微有些复杂一点点拆解:

    这个代码:rowMap.containsKey(rowNumber) 在运行时是会报错的,因为不存containsKey(int)这样的一个方法,我们查看源码可以知道:
    boolean containsKey(Object key);

    这个方法接收的是Object类型,所以传入基本类型是不行的,那我们可以把rowNumber改成非基本类型的吗?

    Integer rowNumber=scoreValue.getRowNumber();

    直接说结论上面的代码是不行的,因为上面说了javassist不支持自动解封包。所以整个代码结构应为:

    public List<ActionValue> execute(Context context){ Map rowMap=new HashMap(); Integer rowNumber=java.lang.Integer.valueOf(this.getRowNumber()); //手动转换类型,后续的Map操作都可以使用了 if(rowMap.containsKey(rowNumber)){ rowItem=rowMap.get(rowNumber); }else{ rowItem=new RowItemImpl(); rowItem.setRowNumber(rowNumber); rowMap.put(rowNumber, rowItem); } } public int getRowNumber() { return rowNumber; }

    最后再总结下编码过程中的一些经验,那就是不要一次性把代码写完,尽量写一行验证一行,这样编译出问题时,可以很快定位到底是哪块代码出现的问题。如果已经写好了代码,那可以使用二分法来定位问题,通过不断的删除代码来确定问题。

http://www.jsqmd.com/news/780466/

相关文章:

  • 开源小型机器人夹爪miniclawd:从设计到实现的完整指南
  • ART-PI开发板实测:解锁STM32H750隐藏的2MB Flash,手把手教你修改Keil MDK链接脚本
  • AUTOSAR DEM操作周期配置避坑指南:从Dem_RestartOperationCycle到CycleQualified的实战解析
  • 30个客户,30本定制手册:文档团队的噩梦
  • OpenClaw三层记忆系统:为AI助手构建可检索的长期知识库
  • 2026年4月目前专业的泡沫包装制造商推荐,电子产品泡沫包装/铝箔保温纸箱/防水纸箱/医药泡沫箱,泡沫包装供应商推荐 - 品牌推荐师
  • 基于MCP协议实现Cursor与Figma双向通信:AI代码助手连接设计工具的完整指南
  • Aspire深度解析
  • 告别冗余!Linux软件卸载命令全攻略,让你的系统焕然一新
  • G-Helper终极指南:AMD CPU降压优化,温度直降15℃的完整教程
  • AI编码助手效率革命:ai-codex工具如何通过静态分析生成项目索引
  • 2025届学术党必备的六大降重复率工具推荐
  • 游戏数据可视化实战:osu!光标叠加层原理、部署与高级配置指南
  • BarTender如何取消激活和重新激活
  • 科研绘图实战:用 Gemini 生成论文级示意图(机制图/架构图/流程图)
  • PCCAD里标注小尺寸时,如何不显示中间的尺寸线
  • Cursor Free VIP:开源工具助你免费畅享 Cursor AI Pro 功能,提升编程效率与代码质量,提供重置机器 ID 的功能
  • 【Python实战】告别杂乱脚本!基于SOLID原则与策略模式的 PDF转Word 批量处理系统
  • ChatLLM-Web:基于Vue与FastAPI的轻量级LLM应用开发框架解析
  • Cursor AI编程效率追踪器:本地化数据采集与可视化分析实践
  • AI工作空间自动化清理:OpenClearn工具的安全策略与实战指南
  • 2026年靠谱的液碱液体氢氧化钠/片碱片状氢氧化钠优质公司推荐 - 品牌宣传支持者
  • OTN技术如何提升城域以太网传输效率
  • 看外语视频终于不慌了!这款双语字幕插件真实体验
  • Windows Cleaner:专注 C 盘清理的开源免费工具,可以清理内存和临时文件,还能对磁盘进行分析,开源无广告,无需注册,界面友好
  • 用Verilog复现tiny_ODIN:一个给数字IC新手的SNN加速器入门实战(附环境配置避坑指南)
  • 基于Vue 3与Vite构建开源仪表盘:技术栈解析与工程实践
  • GNSS模拟器在汽车电子测试中的关键应用与技术解析
  • 2026-05-09:不同元素和至少为 K 的最短子数组长度。用go语言,给定一个整数数组 nums 和一个整数 k。你需要在数组中找一个连续的非空子数组,使得这个子数组里不同元素的种类数对应的取值之
  • NPJ Precis Oncol(IF=8)哈尔滨医科大学附属肿瘤医院韩鹏等团队:一种可解释的深度学习生物标志物用于胃癌预后评估及辅助化疗获益预测