【发布时间】:2017-12-21 04:50:50
【问题描述】:
我的问题与@ronmamo 在 github 上的 Reflections 库有关,并将其集成到我的 Android 项目中以动态访问从某个接口继承的所有类。
我对 gradle 或 maven 不太熟悉,所以这对我来说是一个学习过程,但我遇到了一个障碍,不知道如何调试/找到这个问题的答案。
正如@ronmamo 建议的here,我想在构建时生成一个包含所有扫描元数据的 xml 文件,并让 Reflections 稍后在我的代码中使用它时收集它:
虽然扫描可以在您的引导时轻松完成 应用程序 - 不应该花很长时间,有时这是一个好主意 将反射集成到您的构建生命周期中。用简单 Maven/Gradle/SBT/可以保存所有扫描的任何配置 在编译后将元数据转换为 xml/json 文件。后来,当 您的项目正在引导您可以让 Reflections 收集所有 这些资源并为您重新创建该元数据,使其成为 在运行时可用而无需重新扫描类路径 - 从而减少 引导时间。
我不确定我是否完全理解这种“引导”发生在整个过程中的确切位置(就 android 应用程序生命周期等甚至构建时间而言?)所以我不确定在哪里调用 Reflections.collect ()。目前,当用户到达程序中的某个点时,我稍后会在我的应用程序中调用它。
从几个 stackoverflow 帖子和 git 自述文件中,我现在想出了这个:([...] 表示删除了不相关的代码)
build.gradle(模块:app):
dependencies {
[...]
compile 'org.reflections:reflections:0.9.11'
}
build.gradle(项目:MyProject):
buildscript {
repositories {
jcenter()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
classpath 'org.reflections:reflections:0.9.11'
}
}
allprojects {
repositories {
jcenter()
}
}
task runReflections {
doLast {
org.reflections.Reflections("f.q.n").save("${sourceSet.main.output.classesDir}/META-INF/reflections/myproject-reflections.xml")
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
稍后在我的代码中(这个类在某个时候通过用户输入到达,而不是在应用启动时加载):
Reflections reflections = Reflections.collect();
Set<Class<? extends MyInterface>> allClasses = reflections.getSubTypesOf(MyInterface.class);
这会产生以下异常,因为“reflections”未实例化且值为“null”:
Attempt to invoke virtual method 'java.util.Set org.reflections.Reflections.getSubTypesOf(java.lang.Class)' on a null object reference
我知道生成的 .xml 文件位于进行构建的计算机上,我不确定这是否也传输到了 android 设备,所以我猜这就是失败的原因。但是在 apk 传输并在我的 android 设备上运行之前,我的 Java 代码在什么时候可以访问此文件?
我尝试从不同的角度以多种不同的方式在谷歌上搜索它,但我似乎找不到使反射在 Android 中工作的解决方案。我了解此处解释的原理,并且在构建时在 xml 文件中生成信息以在运行时提供类信息似乎更好。但是我该如何正确设置呢?
谢谢
【问题讨论】:
标签: android gradle reflection android-gradle-plugin