分享一个 Springboot + GraalVM 对反射的处理方式

9次阅读

共计 1282 个字符,预计需要花费 4 分钟才能阅读完成。

GraalVM 官方对反射的出来,要求程序员自己去把所欲需要的类全部写到配置文件,否则运行就会处理失败, 配置文件放在 resource 下面的 reflect-config.json 文件中。

类多的话,每次都要写一大堆,我用起来感觉非常不方便。

后面用了 Quarkus,可以直接用一个注解标识,然后就完全不用写配置文件了,这种只要不是去动老代码,开发过程是非常方便的。

所以想让 spring 也支持使用一个注解就能搞定反射,而不是去写一堆的配置文件。spring 6.x 本身提供了两个基础注解,但是不能直接支持,需要自己再封装一下就可以了。把封装代码放下面,非常简单,拷贝即用:

@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
@MustBeDocumented
annotation class ReflectiveClass

@Configuration
@ImportRuntimeHints(AppRuntimeHintsRegistrar::class)
class AppConfiguration

class AppRuntimeHintsRegistrar : RuntimeHintsRegistrar {override fun registerHints(hints: RuntimeHints, classLoader: ClassLoader?) {val scanPackages = listOf("ai.article")

        val scanner = ClassPathScanningCandidateComponentProvider(false)
        scanner.addIncludeFilter(AnnotationTypeFilter(ReflectiveClass::class.java))

        for (package2Scan in scanPackages) {val reflectiveClasses = scanner.findCandidateComponents(package2Scan).map {Class.forName(it.beanClassName, true, classLoader)
            }
            for (className in reflectiveClasses) {hints.reflection().registerType(className,
                    MemberCategory.INVOKE_DECLARED_CONSTRUCTORS,
                    MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS,
                    MemberCategory.INVOKE_DECLARED_METHODS,
                    MemberCategory.INVOKE_PUBLIC_METHODS,
                    MemberCategory.DECLARED_FIELDS,
                    MemberCategory.PUBLIC_FIELDS
                )
            }
        }
    }
}

现在只需要再需要反射的类上面使用 @ReflectiveClass 就可以了。不需要其他任何额外的工作。

正文完
 0