javassit使用过程的坑
https://segmentfault.com/a/1190000044154053https://blog.csdn.net/Kingairy/article/details/104003524经过不断的试错和研究总结如下以CtMethod#setBody 方法为例不要在代码中使用范型哪怕是定义ListObject这样基础范型这样定义会报错[source error] bad field access 或者 [source error] bad filed access不支持增强for循环否则会报错 [source error] ; is missing可以使用迭代器来代替使用类的全限定名不管是基础类型还是其他类(别忘了异常类)javassist不支持基本类型的自动解包如 boolean 与 Boolean、Int与Integer 是不同的这个时候就需要手动进行解包了。public ListActionValue execute(Context context){ boolean isdebugfalse; if(this.getDebug()!null){ isdebugthis.getDebug(); //由于getDebug()返回的是包装类型如此赋值代码编译没问题但运行时会报错应使用 this.getDebug().booleanValue() } } public Boolean getDebug() { return debug; }上面的代码是布尔类型的。public ListActionValue execute(Context context){ Map rowMapnew HashMap(); int rowNumberthis.getRowNumber(); if(rowMap.containsKey(rowNumber)){ rowItemrowMap.get(rowNumber); }else{ rowItemnew 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 rowNumberscoreValue.getRowNumber();直接说结论上面的代码是不行的因为上面说了javassist不支持自动解封包。所以整个代码结构应为public ListActionValue execute(Context context){ Map rowMapnew HashMap(); Integer rowNumberjava.lang.Integer.valueOf(this.getRowNumber()); //手动转换类型后续的Map操作都可以使用了 if(rowMap.containsKey(rowNumber)){ rowItemrowMap.get(rowNumber); }else{ rowItemnew RowItemImpl(); rowItem.setRowNumber(rowNumber); rowMap.put(rowNumber, rowItem); } } public int getRowNumber() { return rowNumber; }最后再总结下编码过程中的一些经验那就是不要一次性把代码写完尽量写一行验证一行这样编译出问题时可以很快定位到底是哪块代码出现的问题。如果已经写好了代码那可以使用二分法来定位问题通过不断的删除代码来确定问题。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2596638.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!