我正在用LibGDX开发一个Android游戏,并且动态加载了许多类,在apk的发行版中,我无法使用以下方式加载它们:
Class.forName(className);
我得到ClassNotFoundException
,分析了apk,我发现dex文件中的类名仅简化为一个字母,我猜这就是为什么我无法加载的原因。 LibGDX项目包含两个部分:核心和android,第一部分执行我想要的加载,并且没有android API deps,他确实是android项目的dep,他将在活动中运行并使用核心功能。
在android项目上,我可以使用此示例代码在onCreate中加载类:
try {
Class clazz = Class.forName("game.ui.TreasureChest");
TreasureChest chest = (TreasureChest)clazz.newInstance();
chest.update(0.0f);
}catch(Exception ex){
Log.v("loadClassses", "exception: " + ex.getMessage());
}
这段代码没有给我任何例外,显然这两个项目使用了differents类加载器,而android版本专用于该dex文件。 这段代码无法正常工作:
Class clazz = Class.forName("game.ui.TreasureChest", true, this.getClass().getClassLoader());
为什么会这样? 在android docs中,据说第一个示例与第二个示例等效,因此不应有例外。
我还有另一种方法来加载这些类吗? 我在一个界面中思考,其中android项目将实现通过名称来加载给定类,但是forName方法的任何变体都不能在该界面中使用。
答案 0 :(得分:1)
我找到了问题的根源,一段时间后,我正在查看gradle构建文件并看到以下行:
minifyEabled true
我很久以前就把它放在那儿了,这是名称缩小的原因,然后类加载器找不到类,将其删除使一切正常工作