You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BeanShell能否直接创建而非导入Java类?Android动态开发报错求解

报错原因

BeanShell默认生成的是标准JVM格式的类字节码,Android系统的ART/Dalvik虚拟机无法直接识别加载,因此不支持在BeanShell执行脚本中直接定义Java类,你遇到的can't load this type of class file报错就是这个原因导致的。

实现方案

该需求完全可以通过BeanShell实现,不需要自定义实体类:BeanShell是弱类型脚本语言,你可以直接将服务端返回的JSON解析为Map结构,通过键名直接读取字段值,天然适配编译期类结构未知的场景,不需要提前定义实体类,服务端调整字段结构后直接同步修改下发的脚本取值逻辑即可,不需要改动APP端编译好的代码。

修改后代码示例

删掉原脚本中LastNews类的全部定义代码,将后续解析逻辑替换为以下内容即可:

LinearLayout listNews = ViewCreator.linearLayout(context, null, -1);
// 直接解析为ArrayList<Map>,不需要指定实体类类型
ArrayList<Map> news = new Gson().fromJson(jsonNews, new TypeToken<ArrayList<Map>>(){}.getType());
for(int i = 0; i < news.size(); i++){
    Map lastNews = news.get(i);
    // 直接通过JSON字段名取值即可
    String id = lastNews.get("id").toString();
    String head = lastNews.get("head").toString();
    String icon = lastNews.get("icon").toString();
    String type = lastNews.get("type").toString();
    String location = lastNews.get("location").toString();

    // 原有创建列表项视图、添加到listNews的逻辑正常写即可
    TextView newsTitle = ViewCreator.textView(context, head, null, 10, 15, "#222222", null);
    listNews.addView(newsTitle);
}
scrollLayout.addView(listNews);

如果你的Decoder工具类支持解析为Map结构,也可以直接替换Gson的解析逻辑,用法完全一致。

内容的提问来源于stack exchange,提问作者Dima Chibuk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 18:39:02