【问题标题】:Android: How to dynamically load classes from a JAR file?Android:如何从 JAR 文件中动态加载类?
【发布时间】:2011-10-30 19:57:32
【问题描述】:

我正在尝试在 Android 平台上在运行时动态加载一个类。该类包含在一个单独的库 JAR 文件中,但与 APK 一起打包(根据 SDK 中的新库机制)。使用 Class.forname 方法时,我收到了一个找不到类的异常。我看过一些关于 DexClassLoader 方法的讨论,但我找不到一个很好的例子来说明它是如何使用的(以及它是否是最好的方法——它似乎比 forname 方法复杂得多!)。

如果有人能提供一个示例 sn-p 的代码说明如何进行此操作,我将不胜感激。

非常感谢您的帮助。

【问题讨论】:

    标签: java android classloader


    【解决方案1】:

    这是一个动态加载DevicePolicyManager 类的示例。

    Class myClass =                                                                        
      ClassLoader.getSystemClassLoader().loadClass("android.app.admin.DevicePolicyManager")
    
    Object DPMInstance = myClass.newInstance();                                            
    
    Method myMethod = myClass.getMethod("setPasswordQuality",                              
                                        new Class[] { ComponentName.class,                 
                                                      int.class });                        
    myMethod.invoke(DPMInstance,                                                           
                    new Object[] { myComponentName,                                        
                                   PASSWORD_QUALITY_NUMERIC }); 
    

    这很有用,因此您可以选择仅在设备运行足够高的 SDK 版本时才加载类。

    【讨论】:

    • 谢谢丹。但是,我仍然使用此方法得到 ClassNotFoundException。如果该类在主应用程序中而不是 JAR 文件中,则该类将正常加载,因此如果 JAR 不是在代码中直接引用(因此未由 ClassLoader 加载),则可能需要先扩展 JAR 以获取该文件?跨度>
    • 如果 JAR 已经包含在您的 APK 中,那么我希望该类可用。但是,这个问题是否给您任何额外的提示? stackoverflow.com/questions/194698/…
    • 假设您使用的是 Eclipse,我倾向于使用 Properties -> Java Build Path -> Projects -> Add to a required project。我不知道这与 Properties -> Android -> Library 功能有什么关系(我猜你正在使用)...
    • 这是我在过去 2 周搜索的内容.. 非常感谢好友.. 非常感谢您的回答..!! @DanJ
    • 我也有同样的问题。一个带有一组动态类的 jar,除了动态加载之外,这些类不以任何其他方式引用。我会认为谷歌试图不使用移动设备上的所有内存会试图从人们通常包含在应用程序中的大罐子中剔除“死代码”。我想知道如果类没有“导入”或通过 dex 解析器管理器等可以发现的引用显式加载,是否会发生这种情况。不知道是不是这种情况?
    猜你喜欢
    • 2020-06-08
    • 2014-12-29
    • 2011-12-24
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    相关资源
    最近更新 更多