
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 就可以了。 不需要其他任何额外的工作。
1 9pr7im4IjQ9u0806 2024-07-31 10:10:37 +08:00 没用过,表示点赞学习 |
2 kylix 2024-07-31 12:23:05 +08:00 感谢分享!有空试试 |
3 CodeCodeStudy 2024-07-31 13:37:35 +08:00 如果引入了第三方依赖呢,该怎么办? |
4 karottc OP @CodeCodeStudy 这个要看具体的情况,比如 gson 这个第三方库,上面的注解就没问题,可以解决。 |
5 codingmiao 2024-08-08 15:30:49 +08:00 我是 java -agentlib:native-image-agent=config-output-dir=META-INF/native-image -jar xxx.jar 先跑起 jar 包来,然后跑测试用例,测完后 reflect-config.json 这些也自动生成出来了,优点是不用去动原来的代码,缺点是测试用例覆盖不全的话可能会出问题。 |