首页 > 解决方案 > 无法使用反射获取包的类

问题描述

在此处输入图像描述

从上图中,当我尝试获取“测试”下的所有类时,我得到的是空数组。

    Reflections reflections = new Reflections("tests");
    //Reflections reflections = new Reflections("src.test.java.tests"); Tried but still empty array

     Set<Class<? extends Object>> allClasses =  reflections.getSubTypesOf(Object.class); //Getting empty array here
     Class[] arrayCls=new Class[allClasses.size()];
     allClasses.toArray(arrayCls);

有人可以帮我如何获得一系列课程吗?

标签: javareflectionreflections

解决方案


这个解决方案对我有用,我在 src 文件下有一个打包的命名测试,它直接包含类和带有类的子包,它返回到包含相应类的正确集合。Reflections 构造函数的第一个参数必须是您的 packageName 附加一个“。” 到底 :

   Reflections reflections = new Reflections("testing.", new SubTypesScanner(false));
   Set<Class<?>> classes = reflections.getSubTypesOf(Object.class);

不要忘记将相应的 jars 添加到您的项目中:annotations-2.0.1.jar,guava-15.0,javassist-3.19.0-GA,reflections-0.9.10 您可以从这里下载它们https://jar -download.com/artifacts/org.reflections/reflections/0.9.10/source-code

更新:这将在测试包下工作。它基于 Guava 14 中的 ClassPath 类。这里使用 TestNGRunner 类加载器来获取放置在 TestNGRunner 的同一 src 包下的类,即 src/test/java。检查完成了类的全名 (packageName+.+className) 这就是我使用startsWith("tests.") 的原因:

   final ClassLoader loader = TestNGRunner.class.getClassLoader();
    Set<Class<? extends Object>> allClasses = new HashSet<Class<? extends Object>>();
    for (final ClassPath.ClassInfo info : ClassPath.from(loader).getTopLevelClasses()) {
      if (info.getName().startsWith("tests.")) {
          allClasses.add(info.load());
      }
    }

推荐阅读