首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android DexClassLoader如何使用带参数和参数的类

Android DexClassLoader如何使用带参数和参数的类
EN

Stack Overflow用户
提问于 2017-06-05 09:01:45
回答 1查看 593关注 0票数 0

我想从.jar文件中加载外部类。它工作得很好。

使用DexClassLoader加载类:

代码语言:javascript
复制
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

        }

我知道如何使用在类中定义的函数,但如何像这样使用它:

代码语言:javascript
复制
File f = new File("/dir/File.txt");
EN

回答 1

Stack Overflow用户

发布于 2017-06-05 21:37:06

经过几个小时的搜索和测试,我找到了解决方案。

  1. 定义新的DexClassLoader:

// .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");

  • If Class to be myClass myClass = null;myClass=classLoader.loadClass(“my.test.app.neededClass”);

  • If类需要参数,和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");`

  • Now我们可以将neededClass中定义的已知函数提取到方法中,例如:

方法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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44360357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档