是否可以使用反射找到包中的所有类?

是否可以使用反射找到包中的所有类?

是否有可能在给定的包中找到所有的类或接口?(快速查看。Package,这似乎是不可能的。)



侃侃尔雅
浏览 804回答 4
4回答

拉风的咖菲猫

由于类加载器的动态特性,这是不可能的。类加载器不需要告诉VM它可以提供哪些类,相反,它们只是被传递给类的请求,并且必须返回类或抛出异常。但是,如果编写自己的类加载器,或者检查类路径和JAR,就可以找到这些信息。这将通过文件系统操作,而不是反射。甚至可能有一些库可以帮助您这样做。如果存在生成或远程传递的类,则无法发现这些类。通常的方法是在某个地方注册您需要在文件中访问的类,或者在另一个类中引用它们。或者只是在命名时使用约定。增编:反思图书馆将允许您在当前类路径中查找类。它可以用于获取包中的所有类:&nbsp;Reflections&nbsp;reflections&nbsp;=&nbsp;new&nbsp;Reflections("my.project.prefix"); &nbsp;Set<Class<?&nbsp;extends&nbsp;Object>>&nbsp;allClasses&nbsp;=&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reflections.getSubTypesOf(Object.class);

长风秋雁

您可能应该看看开放源码。反射库..有了它,你可以很容易地实现你想要的。首先,设置反射索引(因为默认情况下禁用了对所有类的搜索,这有点麻烦):List<ClassLoader>&nbsp;classLoadersList&nbsp;=&nbsp;new&nbsp;LinkedList<ClassLoader>(); classLoadersList.add(ClasspathHelper.contextClassLoader()); classLoadersList.add(ClasspathHelper.staticClassLoader()); Reflections&nbsp;reflections&nbsp;=&nbsp;new&nbsp;Reflections(new&nbsp;ConfigurationBuilder() &nbsp;&nbsp;&nbsp;&nbsp;.setScanners(new&nbsp;SubTypesScanner(false&nbsp;/*&nbsp;don't&nbsp;exclude&nbsp;Object.class&nbsp;*/),&nbsp;new&nbsp;ResourcesScanner()) &nbsp;&nbsp;&nbsp;&nbsp;.setUrls(ClasspathHelper.forClassLoader(classLoadersList.toArray(new&nbsp;ClassLoader[0]))) &nbsp;&nbsp;&nbsp;&nbsp;.filterInputsBy(new&nbsp;FilterBuilder().include(FilterBuilder.prefix("org.your.package"))));然后可以查询给定包中的所有对象:Set<Class<?>>&nbsp;classes&nbsp;=&nbsp;reflections.getSubTypesOf(Object.class);

开满天机

GoogleGuava 14包括一个新的类ClassPath使用三种方法扫描顶级类:getTopLevelClasses()getTopLevelClasses(String packageName)getTopLevelClassesRecursive(String packageName)见ClassPathjavadocs想了解更多信息。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java