news 2026/5/9 3:06:28

javassit使用过程的坑

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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; }

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/9 2:59:45

Gemini31Pro接入企业知识库实践

概要Gemini 3.1 Pro 是 Google DeepMind 于 2026 年 2 月发布的旗舰模型&#xff0c;支持开发者通过 Gemini API、Vertex AI 等渠道调用。该模型采用 MoE&#xff08;混合专家&#xff09;架构&#xff0c;上下文窗口扩展至 100 万 token&#xff0c;支持文本、图片、PDF、视频…

作者头像 李华
网站建设 2026/5/9 2:57:08

什么是数据接口

数据接口的概念与定义数据接口是不同系统、应用程序或组件之间进行数据交换的标准化通道。它定义了数据如何被请求、传输和解析&#xff0c;确保不同平台能够无缝协作。常见的数据接口类型包括API&#xff08;应用程序编程接口&#xff09;、Web Service、数据库连接接口等。数…

作者头像 李华
网站建设 2026/5/9 2:55:30

Godot游戏集成Nakama服务器:开源后端引擎与实时对战开发指南

1. 项目概述&#xff1a;当游戏服务器遇上开源引擎如果你正在用Godot引擎开发一款需要在线功能的游戏&#xff0c;比如多人对战、排行榜、实时聊天或者玩家数据云端存储&#xff0c;那你大概率绕不开一个核心问题&#xff1a;后端服务器怎么搞&#xff1f;自己从头搭建一套&…

作者头像 李华
网站建设 2026/5/9 2:52:31

浏览器本地AI助手实现:基于WebAssembly与WebGPU的模型部署与优化

1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目&#xff0c;叫BrowserAI。光看名字&#xff0c;你可能会觉得这又是一个“大而全”的AI套壳应用&#xff0c;但点进去仔细研究后&#xff0c;我发现它的定位非常精准&#xff1a;一个完全在浏览器本地运行的AI助手。…

作者头像 李华