Android 有没有一种方法可以使用DexClassLoader而不使用反射*everywhere*?

Android 有没有一种方法可以使用DexClassLoader而不使用反射*everywhere*?,android,classloader,Android,Classloader,我有一个图书馆,我计划在dex表单中使用。我想直接编译这个库,但不导出它。相反,我想把它放到我的资源中,并使用类加载器来实际实例化它 这是我的图书馆: public class Foo { public doFoo(String message) { } public doFoo(int count, String message) { } } 现在我想调用doFoo()。很多比使用反射可能更合理。目前,它与: public class FooConsumer { pri

我有一个图书馆,我计划在dex表单中使用。我想直接编译这个库,但不导出它。相反,我想把它放到我的资源中,并使用类加载器来实际实例化它

这是我的图书馆:

public class Foo {
  public doFoo(String message) {
  }

  public doFoo(int count, String message) {
  }
}
现在我想调用
doFoo()
。很多比使用反射可能更合理。目前,它与:

public class FooConsumer {
  private final DexClassLoader fooLoader;

  public FooConsumer(DexClassLoader fooLoader) {
    this.fooLoader = fooLoader;
  }

  public void go() {
    Class<?> fooClass = fooLoader.loadClass("com.library.Foo");
    Object fooInstance = fooClass.newInstance();
    Method fooMethodDoFoo = fooClass.getMethod("doFoo", String.class);
    fooMethodDoFoo.invoke(fooInstance, "Hello World");
  }
看到我在那里做了什么吗?内部类只是Foo对象的包装器,我已经针对它进行了链接,但没有导出它,这一切都很好。但它不起作用。在logcat中,我得到了

I/TEST: fooInstance: com.library.Foo@413b1b68
E/AndroidRuntime: java.lang.NoClassDefFoundError: com.library.Foo
  ...

有没有办法让FooAccessor使用我传入的类加载器?或者使用类加载器是对反射地狱的诅咒。

您可能想看看这个要点


它使用反射将新的DexClassLoader合并到库存中的BaseDexClassLoader。

您可能想看看这个要点


它使用反射功能将新的DexClassLoader合并到库存中的DexClassLoader。

为了避免这个明显的问题,我这样做是因为我希望能够在Foo上进行向后兼容的升级,而不必推送我的应用程序的全新版本。看看这个。是的,我看到了那个。它不包括能够使用静态方法,它依赖于对库的控制,不幸的是,我没有。你解决问题了吗?没有,项目结束了:-(为了避开这个明显的问题,我这么做是因为我希望能够在Foo可用的情况下为其提供向后兼容的升级,而不必推送我的应用程序的全新版本。看看这个。是的,我看到了那个。它不包括能够使用静态方法,它依赖于控制库,而h很遗憾,我没有。你解决问题了吗?没有,我退出了项目:-(
I/TEST: fooInstance: com.library.Foo@413b1b68
E/AndroidRuntime: java.lang.NoClassDefFoundError: com.library.Foo
  ...