使用反射加载片段导致" java.lang.IllegalAccessError:预验证类中的类ref解析为意外实现"

时间:2015-12-24 07:39:00

标签: android android-fragments reflection

我正在开发android企业应用程序,我想在运行时使用一些文件。我可以使用 Java Reflection 使用简单的类,我也想使用Fragment。

例如,我创建了 TestingDummyJar.jar并放入SDCard
用法 - 首先我使用DexClassLoader加载这个jar然后加载类。 它非常适合简单类 -

final File tmpDir = this.getDir("dex", 0);
classloader = new DexClassLoader("/SDcard/TestingDummyJar.jar", tmpDir.getAbsolutePath(), null, this.getClassLoader());
mLoadedClass = (Class<Object>) classloader.loadClass("com.example.testingdummyjar.TestingDummyReflection");<br>

但是当我尝试将片段加载为 -

mLoadedClass = (Class<Object>) classloader.loadClass("com.example.testingdummyjar.ImageParticularFragment");

抛出异常&#34; java.lang.IllegalAccessError:预验证类中的类ref已解析为意外实现&#34;

谁能告诉我,是否有可能从Jar文件中加载片段? 如果是,那么请给我一些线索如何做到?

找到解决方案寻求帮助。
我试图从jar文件加载的片段是使用 android.support.v4库,我想要使用的应用程序也使用 android.support.v4库 。但是两个应用程序都需要Library,因为在这两个应用程序中都使用了片段 所以我想删除 android.support.v4库。你能帮我摆脱它吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

如果您使用的是Android Studio,或者正在使用Gradle,请将主要应用和您通过DexClassLoader加载的JAR之间共享的依赖关系范围更改为provided,而不是{{1} }。

在您的情况下,应用和JAR都依赖于compile。在应用中,正常使用support-v4。在JAR中,使用compile 'com.android.support:support-v4:24.2.0'

在Android 5.0+上似乎不需要这样,可能是因为ART。在4.4及更老版本中,如果应用程序和JAR具有相同的类,Dalvik会感到恼火。切换到provided 'com.android.support:support-v4:24.2.0'说“针对这些类编译,但不要将它们打包到库中,因为我们将从其他地方获得这些类的实现”。在这种情况下,JAR从应用程序的类加载器(provided)获取实现。