我想从.jar文件中加载外部类。它工作得很好。
使用DexClassLoader加载类:
DexClassLoader classLoader = new DexClassLoader(
libFile.getAbsolutePath(),
tmpDir.getAbsolutePath(),
null,
ClassLoader.getSystemClassLoader());
Class<?> customFileClass = null; // extends File class
try {
customFileClass = (Class<?>) classLoader.loadClass("test.MyClass");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
}我知道如何使用在类中定义的函数,但如何像这样使用它:
File f = new File("/dir/File.txt");发布于 2017-06-05 21:37:06
经过几个小时的搜索和测试,我找到了解决方案。
// .jar文件必须是Dexted的。我知道两种方法: // 1.通过控制台: dx --dex --output="output.jar“"input.jar”// 2.你可以在你的应用中从Android-Sdk/build-tools/xx.x.x/lib/dx.jar导入dx.jar,并使用以下命令转换.jar文件: // String[]命令= String[] {"--dex","--output="output.jar","input.jar"};// com.android.dx.command.Main.main(命令);DexClassLoader classLoader =DexClassLoader DexClassLoader( "absolutePathToJarFile","absolutePathToTmpDir",null,classLoader.loadClass("my.test.app.neededClass");
new myClass("arg1", "arg2");一样,我们需要创建新的参数类:Class[] args = Class1;// 1是参数的个数args = String.class;//“String”类型的第一个参数
Constructor构造函数= null;尝试{构造函数= myClass.getDeclaredConstructor(args);} catch (NoSuchMethodException e) { // TODO自动生成的catch块}对象neededClass = null;neededClass = constructor.newInstance("First String Argument");`
方法exists = null;exists = myClass.getMethod("exists");// exists()是neededClass内部定义的布尔函数。exists.setAccessible( true );if((boolean) exists.invoke(neededClass)){ // do if true} else { // do if false }
像File这样的类的问题是,我们需要在AsyncTask内部调用方法。如果我们试图在AsyncTask之外调用方法,像File.exists()这样的类的已定义函数将不会被调用,并且我们会得到错误InvocationTargetException。
https://stackoverflow.com/questions/44360357
复制相似问题