已解决 插件运行时reflections框架无法扫描到带有对应注解的类
-
工程是idea里mirai console插件里自带的java工程模板
jdk版本:openjdk 17
问题代码:
Class CommandMap{ public CommandMap(boolean scan) { if (scan) this.scan(); } private void scan() { Reflections reflector = new Reflections("com.example"); Set<Class<?>> classes = reflector.getTypesAnnotatedWith(Command.class); } }
调用(测试)均通过以下方式调用:
CommandMap cm=new CommandMap(true);
问题描述:使用项目模板自带的运行配置运行,reflections框架无法扫描到带有对应注解的类,使用junit运行测试代码可以扫描到对应的类。
直接运行代码,classes的size为0,没有扫描到类
使用junit运行测试代码,classes的size为1,成功扫描到了一个类
-
实际在 mirai-console 运行时, 插件不会直接加载到 AppClassLoader, 而是有独立的类加载器,以保证类隔离不相互影响
你需要给 Reflections 添加 当前插件的类加载器作为 扫描目标 -
解决了,在创建变量的时候直接传入pluginloader的classloader即可,代码如下
//变量在插件主类中创建 Reflections reflector=new Reflections("包名路径",getLoader().getClassLoaders().toArray());
-