Android Class.forName 无法使用默认 class 加载程序加载 class
Android Class.forName can't load class with default class loader
我正在用 LibGDX 开发一个 android 游戏,有很多 classes 是动态加载的,在 apk 的发布版本中我无法加载它们使用:
Class.forName(className);
我得到 ClassNotFoundException
,分析 apk 我看到 dex 文件中的 classes 名称被简化为只有一个字母,我想这就是我无法加载的原因。 LibGDX 项目有两部分:核心和 android,第一个是我想要的加载,没有 android API deps,他确实是 android 项目 运行 在 activity 中并使用核心功能。
在 android 项目上,我可以使用此示例代码在 onCreate:
中加载 classes
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());
}
这段代码没有给我任何例外,显然这两个项目使用不同的 class 加载程序,而 android 版本专门用于此 dex 文件。
此代码无效:
Class clazz = Class.forName("game.ui.TreasureChest", true, this.getClass().getClassLoader());
为什么会这样?
在 android 文档中,据说第一个示例等同于第二个示例,因此不应有例外。
加载这些 classes 有另一种解决方案吗?
我在考虑一个界面,其中 android 项目将实现通过名称加载给定的 class,但是 forName 方法的变体在界面中都不起作用。
我找到了问题的根源,一段时间后我在查看 gradle 构建文件时看到了这一行:
minifyEabled true
我很久以前就把它放在那里了,这是缩小名称的原因,然后类加载器找不到 类,删除它后一切正常
我正在用 LibGDX 开发一个 android 游戏,有很多 classes 是动态加载的,在 apk 的发布版本中我无法加载它们使用:
Class.forName(className);
我得到 ClassNotFoundException
,分析 apk 我看到 dex 文件中的 classes 名称被简化为只有一个字母,我想这就是我无法加载的原因。 LibGDX 项目有两部分:核心和 android,第一个是我想要的加载,没有 android API deps,他确实是 android 项目 运行 在 activity 中并使用核心功能。
在 android 项目上,我可以使用此示例代码在 onCreate:
中加载 classes 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());
}
这段代码没有给我任何例外,显然这两个项目使用不同的 class 加载程序,而 android 版本专门用于此 dex 文件。 此代码无效:
Class clazz = Class.forName("game.ui.TreasureChest", true, this.getClass().getClassLoader());
为什么会这样? 在 android 文档中,据说第一个示例等同于第二个示例,因此不应有例外。
加载这些 classes 有另一种解决方案吗? 我在考虑一个界面,其中 android 项目将实现通过名称加载给定的 class,但是 forName 方法的变体在界面中都不起作用。
我找到了问题的根源,一段时间后我在查看 gradle 构建文件时看到了这一行:
minifyEabled true
我很久以前就把它放在那里了,这是缩小名称的原因,然后类加载器找不到 类,删除它后一切正常