java - Kotlin 方法上使用的 Java 注释的 getAnnotation 返回 null

标签 java reflection kotlin spring-data-neo4j spring-annotations

比如说,我有以下界面:

interface AppRepository : GraphRepository<App> {

    @Query("""MATCH (a:App) RETURN a""")
    fun findAll(): List<App>
}

在测试中,我想检查查询字符串的细节,因此我这样做了

open class AppRepositoryTest {

    lateinit @Autowired var appRepository: AppRepository

    @Test
    open fun checkQuery() {
        val productionMethod = appRepository.javaClass.getDeclaredMethod("findAll")
        val productionQuery = productionMethod!!.getAnnotation(Query::class.java)

        //demo test
        assertThat(productionQuery!!.value).isNotEmpty() //KotlinNPE
    }
}

出于某种我不理解的原因,productionQuery 为 nnull。我仔细检查了测试类中导入的 Query 和存储库中的 Query 的类型是否相同。

因此,为什么在这种情况下 productionQuery null

最佳答案

您正在从实现类(即 appRepository 实例的类)的 findAll 上加载注释,而不是从 findAll界面。要改为从 AppRepository 加载注释:

val productionMethod = AppRepository::class.java.getDeclaredMethod("findAll")
val productionQuery = productionMethod!!.getAnnotation(Query::class.java)

关于java - Kotlin 方法上使用的 Java 注释的 getAnnotation 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40220141/

相关文章:

java - 将 DeflaterInputStream 功能移植到 .net

java - 使用反射来调用以 WebSphere 数据库连接作为参数的方法

c# - 如何确定一个类型是否实现了特定的泛型接口(interface)类型

java - 在 Android 中将 protobuf(由 grpc 生成)转换为 JSON

generics - 如何在 Kotlin 中约束泛型类型?

java - 访问名称编码未知的文件

java - 使用 System.currentTimeMillis() 时出现问题;在 java

c# - 迭代 ASP.NET MVC View 以查找支持特定模型类型的所有 View

列表回调参数上的 Kotlin 通配符捕获

java - 如何从以下 JSON 字符串中获取 string[]?