热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何以Java编程方式获取接口的所有实现的列表?

如何以Java编程方式获取接

我已经搜索了一段时间,似乎有不同的方法,这里是一个摘要:

如果你不介意添加依赖项,则反射库非常受欢迎。它看起来像这样:

Reflections reflectiOns= new Reflections("firstdeveloper.examples.reflections");
Set> classes = reflections.getSubTypesOf(Pet.class);
ServiceLoader(根据埃里克森的回答),看起来像这样:
ServiceLoader loader = ServiceLoader.load(Pet.class);
for (Pet implClass : loader) {
System.out.println(implClass.getclass().getSimpleName()); // prints Dog, Cat
}

请注意,要使其正常工作,你需要定义PetServiceProviderInterface(SPI)并声明其实现。你这样做,通过创建一个文件resources/Meta-INF/services的名称examples.reflections.Pet和声明的所有实现Pet它

examples.reflections.Dog
examples.reflections.Cat

包级注释。这是一个例子:

Package[] packages = Package.getPackages();
for (Package p : packages) {
MyPackageAnnotation annotation = p.getannotation(MyPackageAnnotation.class);
if (annotation != null) {
Class[] implementatiOns= annotation.implementationsOfPet();
for (Class impl : implementations) {
System.out.println(impl.getSimpleName());
}
}
}

和注释定义:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PACKAGE)
public @interface MyPackageAnnotation {
Class[] implementationsOfPet() default {};
}

并且你必须package-info.java在该包内名为的文件中声明包级注释。以下是示例内容:

@MyPackageAnnotation(implementatiOnsOfPet= {Dog.class, Cat.class})
package examples.reflections;

请注意,只有那时ClassLoader已知的软件包才能通过调用加载Package.getPackages()

此外,还有其他基于URLClassLoader的方法,这些方法将始终限于已加载的类,除非你执行基于目录的搜索。





推荐阅读
author-avatar
小丁啊小丁
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有