gpt4 book ai didi

android - 有没有一种方法可以在不*到处*使用反射的情况下使用 DexClassLoader?

转载 作者:行者123 更新时间:2023-11-30 04:07:58 26 4
gpt4 key购买 nike

我有一个图书馆,我计划以 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");
}

这显然是错误的。特别是因为我没有包括任何异常处理,因为那里有六个 throwables 可以捕获。我可以缓存一堆东西,帮助我提高速度,但不是很多。

通常我都知道有一个接口(interface)的第三个库,但是这个库有一些静态方法,我无论如何都不能编辑它。如果我能做这样的事情就太好了:

public class FooConsumer {
private FooAccessor accessor;

public FooConsumer(DexClassLoader fooLoader) {
Object fooInstance = fooLoader.loadClass("com.library.Foo").newInstance();
Log.i("TEST", "fooInstance: " + fooInstance);
this.accessor = new FooAccessor(fooInstance);
}

public void go() {
accessor.doFoo("Hello World");
}

private static class FooAccessor {
private Foo fooInstance;

public FooAccessor(Object instance) {
fooInstance = (Foo)instance;
}

public void doFoo(String message) {
fooInstance.doFoo(message);
}
}
}

看到我在那里做了什么吗?内部类只是 Foo 对象的包装器,我已经链接到它,但没有导出它,世界上一切都很好。但它不起作用。在 logcat 中我得到

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

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

最佳答案

您可能想看看这个要点。

https://gist.github.com/nickcaballero/7045993

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

关于android - 有没有一种方法可以在不*到处*使用反射的情况下使用 DexClassLoader?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11319791/

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