Android中实现类似Spring的包扫描

2023-12-10

我正在尝试实现一个包扫描功能,类似于 Spring 的component-scan,对于我正在开发的Android框架。基本上,我希望能够指定一个基础包,例如com.foo.bar并检索所有Class具有特定注释的实例。我不想在我的框架中注册每个组件,因为这会破坏自动扫描的目的。

根据我的研究,Java 似乎不可能使用反射来检索给定包名称的资源。不过,我简单地研究了一下思考框架,我想知道是否有 Android 兼容的等效项。如果没有,也许有一种不太明显的方法来完成我想做的事情。

我稍微研究了一下 Spring 源代码,看看他们是如何实现这一目标的,但我不认为他们正在做的事情会在 Dalvik 运行时中起作用。

Update

目前,下面的代码是我能检索包含特定注释的所有类的最佳方法,但坦率地说,这是一个非常糟糕的解决方案。它做出了一些非常不安全的假设ClassLoader另外,它还会扫描(并加载)所有应用程序类。

public Set<Class<?>> getClassesWithAnnotation(Class<? extends Annotation> annotation) {
    Set<Class<?>> classes = new HashSet<Class<?>>();
    Field dexField = PathClassLoader.class.getDeclaredField("mDexs");
    dexField.setAccessible(true);
    PathClassLoader classLoader = (PathClassLoader) Thread.currentThread().getContextClassLoader();
    DexFile[] dexs = (DexFile[]) dexField.get(classLoader);
    for (DexFile dex : dexs) {
        Enumeration<String> entries = dex.entries();
        while (entries.hasMoreElements()) {
            String entry = entries.nextElement();
            Class<?> entryClass = dex.loadClass(entry, classLoader);
            if (entryClass != null && entryClass.isAnnotationPresent(annotation)) {
                classes.add(entryClass);
            }
        }
    }
    return classes;
}

我想在运行时找到所有子类。 所以我一直在寻找android类扫描。 这是我在网络上收集的最终代码。 你会明白的。

public static void findSubClasses(Context context, Class parent) {
    ApplicationInfo ai = context.getApplicationInfo();
    String classPath = ai.sourceDir;
    DexFile dex = null;
    try {
        dex = new DexFile(classPath);
        Enumeration<String> apkClassNames = dex.entries();
        while (apkClassNames.hasMoreElements()) {
            String className = apkClassNames.nextElement();
            try {
                Class c = context.getClassLoader().loadClass(className);
                if (parent.isAssignableFrom(c)) {
                    android.util.Log.i("nora", className);
                }
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            //              android.util.Log.i("nora", className);
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally {
        try {
            dex.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android中实现类似Spring的包扫描 的相关文章

随机推荐

  • 验证 PDO 准备语句中的password_hash()

    我正在尝试使用 bcrypt 算法对密码进行哈希处理 但遇到了一些问题 首先 我找不到合适的地方来检查是否password verify 返回真 admin POST admin user pass POST admin pass pass
  • 如何以编程方式在 Android 中创建另一个应用程序的快捷方式?

    假设 我有一些 Android 应用程序可以帮助用户安装一些其他应用程序 有什么方法可以在主屏幕上创建此应用程序的快捷方式吗 我还可以指定这些快捷方式的位置吗 尝试这个 public void createShortCut Intent s
  • 使用区域设置对 PHP 数组进行排序?

    是否可以使用区域设置对 PHP 数组进行排序 这是设置 我正在用 PHP 制作一个交互式排序列表 通过用户输入 可以使用多个类别 列 之一来指导排序 姓名 居住地等 这是我通过使用解决的array multisort 功能 下一个障碍 该列
  • 如何获取使用 iso-8859-1 编码的页面标题,以便标题在我的 utf-8 网站中正确显示?

    我寻求帮助是因为我确实花了几个小时 超过 5 个 在网上寻找答案 但找不到正确的解决方案 我的项目要求我废弃外部网页的标题 但有时这些页面是用 iso 8859 1 编码的 由于废弃的标题以 utf 8 格式显示在我的页面代码中 因此我得到
  • 如何获取Linux内核中文件的大小?

    我找到了这个链接 http www spinics net lists newbies msg41016 html 并一直在考虑这样做 所以我在内核模块中编写了代码 include
  • 我很难理解 Shellshock 漏洞验证 [重复]

    这个问题在这里已经有答案了 我在检查时得到了这个炮弹休克漏洞 host1 env x echo vulnerable bash c echo hello hello host1 env x echo vulnerable bash c ec
  • 如何获取 Twitch 视频缩略图 URL?

    Youtube 等视频共享网站有一个视频缩略图端点例子 http img youtube com vi youtube id default jpg where youtube id 视频的 ID 所以我只能做 img src http i
  • CakeEmail 未发送,但没有错误

    我对 CakePHP 还很陌生 这是我第一次尝试设置电子邮件表单 保持示例简单
  • 嵌套 Numpy 数组上的 Numba

    Setup 我有以下两种矩阵计算的实现 第一个实现使用matrix of shape n m 并且在 for 循环中重复计算repetition times import numpy as np from numba import jit
  • 为什么“typeof”与“typeof()”相同?

    我正在学习 JavaScript 我在代码中看到了相同的用法typeof and typeof 例如 两种情况的结果都是数字 console log typeof 1 console log typeof 1 typeof是 根据ES5 s
  • 在 .NET 中转换 VB6 PropertyBag

    对于某些文件操作 我们使用 VB6 的 PropertyBag 对象通过 Content 属性将各种项目转换为字节数组 然后我们将字节数组保存为二进制文件的一部分 稍后 当我们加载文件时 我们读回文件 读入字节数组并使用 propertyb
  • kafka jar 不包含 kafka.utils.testutils

    我正在尝试为 kafka 生产者 消费者编写一个单元测试测试用例 并遇到了一个简单的示例http grokbase com t kafka users 13ck94p302 writing unit tests for kafka code
  • 为什么生成器不支持map()?

    对我来说 生成器的功能非常类似于数组 应该支持非常基本的列表操作 例如map filter and reduce 我错过了什么吗 我写的代码是map这看起来很简单 但如果将所有函数都嵌入到所有生成器中会更好 let fancyGen g g
  • 移动设备的 HTML5 本地存储有多安全

    我希望通过将多个表单中输入的数据存储到本地存储中来解决移动网站上的一些性能问题 我将清除加载时的数据并清除最后一页上的数据 以便他们在移动设备上访问网站后不会在设备上留下任何敏感数据 但我确实有一些担忧 其他程序可以访问我存储在本地存储中的
  • 如何使用正则表达式删除一些CSS属性?

    outline style none margin 0px padding 2px background color eff0f8 color 3b3a39 font family Georgia Times New Roman Times
  • 如何在谷歌云控制台上安装 python 3?

    我刚刚开始使用 Google Cloud Console 我创建了一个虚拟机 Red Hat Enterprise Linux 7 预装了 Python 2 7 如何更新到 Python 3 另外 pip install 也不起作用 我猜想
  • JSON.net 反序列化

    我有一个 JSON 编码的字符串 我也在上 C 课 class Pupu public static List
  • 用户注册后Django自动登录(2.1.4)[重复]

    这个问题在这里已经有答案了 在 基于类 注册视图的情况下 新注册用户的自动登录不起作用 我按照以下示例本教程 它提出了以下注册视图 myapp views py from django contrib auth forms import U
  • 如何在 Xcode 7.2 上使用 Storyboard 布置比屏幕高的屏幕内容? [复制]

    这个问题在这里已经有答案了 我使用 swift 2 0 进行编程 并且对在视图控制器上添加更多对象感到困惑 例如 我的视图控制器上需要 14 个具有所需约束的按钮 但我只能在故事板上的视图控制器中一一添加 7 个按钮 因为视图控制器上没有更
  • Android中实现类似Spring的包扫描

    我正在尝试实现一个包扫描功能 类似于 Spring 的component scan 对于我正在开发的Android框架 基本上 我希望能够指定一个基础包 例如com foo bar并检索所有Class具有特定注释的实例 我不想在我的框架中注