MiraiForum

    • 注册
    • 登录
    • 搜索
    • 热门
    • 最新
    • 未解决
    • 标签
    • 群组
    • 友情链接

    已解决 插件运行时reflections框架无法扫描到带有对应注解的类

    开发交流
    2
    3
    291
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • P
      pqwoeiruty 最后由 pqwoeiruty 编辑

      工程是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,没有扫描到类
      捕获.PNG
      使用junit运行测试代码,classes的size为1,成功扫描到了一个类
      捕获1.PNG

      1 条回复 最后回复 回复 引用 0
      • cssxsh
        cssxsh 最后由 编辑

        实际在 mirai-console 运行时, 插件不会直接加载到 AppClassLoader, 而是有独立的类加载器,以保证类隔离不相互影响
        你需要给 Reflections 添加 当前插件的类加载器作为 扫描目标

        P 1 条回复 最后回复 回复 引用 0
        • P
          pqwoeiruty @cssxsh 最后由 pqwoeiruty 编辑

          解决了,在创建变量的时候直接传入pluginloader的classloader即可,代码如下

          //变量在插件主类中创建
          Reflections reflector=new Reflections("包名路径",getLoader().getClassLoaders().toArray());
          
          1 条回复 最后回复 回复 引用 0
          • Topic has been marked as solved  P pqwoeiruty 
          • 1 / 1
          • First post
            Last post
          Powered by Mamoe Technologies & NodeBB | 友情链接 | 服务监控 | Contact