Java 无法在应用程序的onCreate()方法中调用辅助索引中的方法,尽管我以前加载过该索引

Java 无法在应用程序的onCreate()方法中调用辅助索引中的方法,尽管我以前加载过该索引,java,android,dalvik,Java,Android,Dalvik,我正在我的项目中使用multidex解决方案。我找到了多索引的几个lib。它们都基于修改ClassLoader的路径列表字段 反思 一切都好。次级dex中的活动效果良好。但当我调用方法时 在应用程序的onCreate方法的次索引中,将显示ClassDefNotFound异常 虽然我以前装过二级索引,但现在可以了 我非常确定路径列表修改成功。使用Class.forName,在 可以找到辅助索引 谁知道为什么?等待你的回答。非常感谢 在辅助索引中调用方法,如下所示 public class Cust

我正在我的项目中使用multidex解决方案。我找到了多索引的几个lib。它们都基于修改ClassLoader的路径列表字段 反思

一切都好。次级dex中的活动效果良好。但当我调用方法时 在应用程序的onCreate方法的次索引中,将显示ClassDefNotFound异常 虽然我以前装过二级索引,但现在可以了

我非常确定路径列表修改成功。使用Class.forName,在 可以找到辅助索引

谁知道为什么?等待你的回答。非常感谢

在辅助索引中调用方法,如下所示

public class CustomizedApplication extends Application {

@Override
public void onCreate() {
    // load secondary dex here
    Dexter.loadAllDexes(this);

    super.onCreate();

    //invoke method in secondary dex
    ClassInSecondaryDex.foo();

}

}

这不起作用,因为类中使用的所有类在类初始化之前都应该是已知的。您可以使用反射从辅助索引调用方法。所以,如果要调用MyApplication中的任何其他类,您应该将MyApplication添加到mainDexList中,并使用class.forNamecom.package.YourClass调用其他类,并使用反射创建对象和调用方法。您只能在MyApplication类中执行此操作,因为您在其中加载了其他类。如果调用一些依赖于依赖关系的简单类,请考虑将这些依赖项添加到MistDistList

< P>我不是JVM类加载的专家,但从我的经验来看,在类初始化时,应该知道正常使用的类中的所有类,而不是反射。我认为这比调用类装入器时按类装入器搜索所有类要快。因此,在这种情况下,您必须使用反射,但在活动中,所有类都将在活动初始化之前加载,这样它才能工作。当您使用Class.forName类加载器搜索类时,它的工作方式与普通无反射代码中的工作方式不同,因为它确实不高效

试试这个 公共类CustomizedApplication扩展应用程序{ @凌驾 创建时的公共无效{ //在此处加载辅助索引 Dexter.loadAllDexesthis; super.onCreate; //辅助索引中的invoke方法 ClassInSecondaryDex.foo; 试一试{ Class clazz=Class.forNameyour.package.ClassInSecondaryDex; clazz.getMethodfoo.invokeclazz; }卡奇 { e、 打印跟踪; }
}谢谢你的回答。ClassLoader的pathList字段在ClassInSecondaryDex.foo调用之前被修改了。我当时以为ClassLoader会尝试在pathList中找到ClassInSecondaryDex,然后类就会被找到。但它不是那样工作的。我现在真的很困惑。你能帮我一下吗?谢谢!我喜欢你的答案。也许我应该找到一个答案关于虚拟机的书。