当前位置: 首页 > 面试题库 >

在Android中实现类似Spring的软件包扫描

金正阳
2023-03-14
问题内容

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

根据我的研究,似乎Java无法使用反射来获取给定包名称的资源。但是,我简短地研究了Reflections框架,并且想知道是否存在与Android兼容的等效项。如果没有,也许有一种不太明显的方法可以完成我想做的事情。

我稍微看了一下Spring源代码,看看他们是如何实现这一目标的,但是我认为他们在Dalvik运行时中所做的工作并不可行。

更新资料

目前,以下代码是我能够最好地检索包含特定批注的所有类的方法,但是坦率地说,这是一个非常差的解决方案。它会对ClassLoader扫描(并加载)所有应用程序类的plus
做出一些非常不安全的假设。

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;
}

问题答案:

我同意乔普·艾根(Joop
Eggen)的观点,并认为他的方法是一个好的方法。在Android中,我尝试避免使用通常的Web应用程序功能,这些功能会导致应用程序长时间启动。我不使用反射或包裹扫描。

但是,如果您想....如果我正确理解,则需要为一个类添加注释。除了使用批注之外,您还可以使用标记器界面(以便拥有更多的可能性)。

1)看

  • 注释:Java自定义注释和动态加载
    在问题中有一个实现可以回答您的问题。

  • 注释:在运行时扫描Java注释

  • 接口:查找实现接口的Java类
  • 接口:与Java 1.5中的ServiceLoader相似吗?
  • 接口:如何以Java编程方式获取接口的所有实现的列表?
  • 接口:由于该方法昂贵,因此ServiceLoader可能会在执行时间和舒适性之间做出折衷,因为它仅加载服务文件中给定的类。另一方面,如果包中仅包含具有特定接口的类,则ServiceLoader不会那么快。

2)AndroidAnnotations

我更喜欢AndroidAnnotations的工作方式(最好是集成AndroidAnnotations):它会自动添加一个额外的编译步骤,使用标准的Java
Annotation处理工具生成源代码。因此,您无需执行运行时扫描,而是根据编译时生成的注释执行代码。

我认为Bean /
EBean注释可以为您工作(仅单个类):https
:
//github.com/excilys/androidannotations/wiki/Enhance%20custom%20classes

扫描功能不可用,请参见此线程

3)编写自己的注释处理器

  • 请参阅APT(注释处理工具)。想法是生成一个静态函数,该函数返回带注释的类的列表,因此不需要类扫描。
  • 一个很好的资源是http://javadude.com/articles/annotations/index.html


 类似资料:
  • 本文向大家介绍nw.js实现类似微信的聊天软件,包括了nw.js实现类似微信的聊天软件的使用技巧和注意事项,需要的朋友参考一下 nw.js实现类似微信的聊天软件 公司 qq被屏蔽,微信被屏蔽,怎么与外边通讯,你懂的。当然,也适合公司自己内部架设服务器,通讯。  项目地址: free chat 截图: 以上就是给大家分享的这个freechat的全部内容了,小伙伴们可以自由扩展哦,你懂得~

  • 本文向大家介绍Android实现类似3D Touch菜单功能,包括了Android实现类似3D Touch菜单功能的使用技巧和注意事项,需要的朋友参考一下 前言 在开发中,我们经常遇到需要菜单功能的实现,我们经常会参考其他人的优秀设计。比如3D Touch菜单,作为iphone6和iphone6s上引人注目的新功能。现在,我们希望尽力来模仿这种菜单设计,尽力,因为系统的差异,会导致很多东西实现起来

  • 我需要为类构建映射(字面上是

  • 在spring boot应用程序中,我有一个包含应用程序类包,如 默认情况下,它自动从该类的包中设置ComponentScan。然后我有几个子包,每个子包包含几个组件和服务bean(使用注释)。但是为了对不同的用例重用这个应用程序,我需要启用/禁用一些子包中的所有组件,最好是通过一个属性。 那就是我有一些子包,比如 现在,基于某些属性,我想在其中一个包中启用(扫描)bean,例如。 我以为我可以使

  • 我有理由相信SpringBoot至少不会扫描实体类,尽管实体位于主包的子包中。我让它与@ComponentScan注释一起工作,至少在某种程度上是这样。但是,我注意到另一个组件也没有运行。我相信这是一件非常简单的事情,因为这是一份来自不同软件包的非常接近的副本。 注意:我尝试添加@ComponentScan,@EntityScan,@EnableJpaRepository。这已经摆脱了最初的错误,

  • 我正在尝试用composer安装maddhatter/laravelfullcalendar包(laravelhelper for fullcalendar.io)。下面是我运行的命令: ''php.././composer.phar需要maddhatter/laravel fullcalendar'' 结果是这样的: 将^1.3版用于maddhatter/laravel fullcalendar