gpt4 book ai didi

java - Android类加载器: loadClass fails if the class implements an interface

转载 作者:行者123 更新时间:2023-12-01 11:40:05 25 4
gpt4 key购买 nike

我使用以下代码从外部包动态加载类:

Object plugin = null;
String packageName = "unipd.elia.deltapluginaccelerometersensor";
String className = "unipd.elia.deltapluginaccelerometersensor.AccelerometerPlugin";
try {
PackageManager packageManager = getPackageManager();
ApplicationInfo appInfo = packageManager.getApplicationInfo(packageName, 0);
DexFile df = new DexFile(appInfo.sourceDir);
ClassLoader cl = getClassLoader();
Class classToInvestigate = df.loadClass(className, cl);
plugin = classToInvestigate.newInstance();


} catch (Exception e) {
System.out.println("EXCEPTION");
}

问题如下:如果我尝试加载的类是一个“简单”类,一切都会正常,但如果它实现了一个接口(interface),则加载失败。以下是无法加载的类的示例:

    package unipd.elia.deltapluginaccelerometersensor;

public class AccelerometerPlugin implements IDeltaPlugin {

@Override
public String getPluginName() {
return "Accelerometer Sensor Plugin";
}

@Override
public String getPluginID() {
return "delta.plugin.accelerometersensor";
}

@Override
public String getPluginAuthor() {
return "Me";
}
}

以及它实现的接口(interface):

public interface IDeltaPlugin {

String getPluginName();
String getPluginID();
String getPluginAuthor();
}

基本上,如果类实现了该接口(interface),则对 loadClass() 的调用将返回 null。删除“implements”语句,它可以正常加载。

我做错了什么?

最佳答案

好吧,问题在于,有问题的接口(interface)位于一个 Android 库项目中,该项目由正在加载的应用程序和定义要加载的类的 apk 共享。

然后,类加载器会感到困惑,因为它在类路径中找到同一接口(interface)的两个副本。

解决方案:将共享库转换为 JAR 库,并在插件 apk 中以“提供”(而不是“编译”)模式导入它。这样,只有一份接口(interface)副本存在(apk 中正在执行类加载的副本)

关于java - Android类加载器: loadClass fails if the class implements an interface,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29603119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com