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
相关产品推荐
相关产品推荐

