/**
* 获取接口的所有实现类
* @param interfaceClass 接口类
* @param samePackage 是否为同一包路径下
* @return
* @throws ClassNotFoundException
* @throws IOException
*/
public static List<Class<?>> getAllClassesByInterface(Class<?> interfaceClass, boolean samePackage)
throws IOException, ClassNotFoundException, IllegalStateException {
if (!interfaceClass.isInterface()) {
throw new IllegalStateException("Class not a interface.");
}
ClassLoader $loader = interfaceClass.getClassLoader();
// ClassLoader $loader = Thread.currentThread().getContextClassLoader();
/** 获取包名称 */
String packageName = samePackage ? interfaceClass.getPackage().getName() : "/";
return findClasses(interfaceClass, $loader, packageName);
}
/**
* 获取实现接口的实现类文件
* @param interfaceClass
* @param loader
* @param packageName
* @return
* @throws IOException
* @throws ClassNotFoundException
*/
private static List<Class<?>> findClasses(Class<?> interfaceClass, ClassLoader loader, String packageName)
throws IOException, ClassNotFoundException {
List<Class<?>> allClasses = new ArrayList<Class<?>>();
/** 获取包路径 */
String packagePath = packageName.replace(".", "/");
if (!packagePath.equals("/")) {
Enumeration<URL> resources = loader.getResources(packagePath);
while (resources.hasMoreElements()) {
URL $url = resources.nextElement();
allClasses.addAll(findResources(interfaceClass, new File($url.getFile()), packageName));
}
} else {
String path = loader.getResource("").getPath();
allClasses.addAll(findResources(interfaceClass, new File(path), packageName));
}
return allClasses;
}
/**
* 获取文件资源信息
* @param interfaceClass
* @param directory
* @param packageName
* @return
* @throws ClassNotFoundException
*/
@SuppressWarnings("unchecked")
private static List<Class<?>> findResources(Class<?> interfaceClass, File directory, String packageName)
throws ClassNotFoundException {
List<Class<?>> $results = new ArrayList<Class<?>>();
if (!directory.exists()) return Collections.EMPTY_LIST;
File[] files = directory.listFiles();
for (File file : files) {
if (file.isDirectory()) {
// 文件夹-->继续遍历
if (!file.getName().contains(".")) {
if (!packageName.equals("/")) {
$results.addAll(findResources(interfaceClass, file, packageName + "." + file.getName()));
} else {
$results.addAll(findResources(interfaceClass, file, file.getName()));
}
}
} else if (file.getName().endsWith(".class")){
Class clazz = null;
if (!packageName.equals("/")) {
clazz = Class.forName(packageName + "." + file.getName().substring(0, file.getName().length() - 6));
} else {
clazz = Class.forName(file.getName().substring(0, file.getName().length() - 6));
}
if (interfaceClass.isAssignableFrom(clazz) && !interfaceClass.equals(clazz)) {
$results.add(clazz);
}
}
}
return $results;
}
分享到:
相关推荐
Java获取接口所有实现类的方式详解 Java 获取接口所有实现类的方式详解是 Java 编程中的一种常见...如果项目中使用了 Spring,可以使用 Spring 容器来获取接口实现类。如果没有使用 Spring,可以使用 ServiceLoader。
- `Intf`是示例中的接口,`Man`是它的实现类。`isAssignableFrom()`方法用于检查`Class`对象表示的类或接口是否可以被`cls`表示的类或接口赋值。如果`Man`是`Intf`的实现,则`Intf.isAssignableFrom(Man.class)`...
Java动态获取实现某个接口下所有的实现类对象集合 Java 中动态获取实现某个接口下所有的实现类对象集合是一个常见的需求,特别是在基于接口编程的开发模式中。这篇文章将向大家分享如何使用 Java 反射机制和第三方...
本节将深入探讨`Collection`接口及其常用的子接口与实现类。 首先,`Collection`接口概述:它是Java集合框架的根接口,定义了集合的基本操作,如添加、删除和遍历元素。所有集合类都直接或间接地继承自`Collection`...
在Java开发中,"扫描接口实现类"是一个常见的需求,特别是在框架或库的初始化阶段,需要自动发现并加载实现了特定接口的类。这个过程通常涉及到类路径扫描和反射技术。以下将详细介绍这一知识点。 首先,我们需要...
Runnable 接口的实现类需要重写 run() 方法以提供线程的执行逻辑。 2. Thread 类 Thread 类是 Runnable 接口的实现类,它提供了线程的基本操作和管理。Thread 类包含了线程的状态、线程 ID、线程属性、线程优先级...
HashMap是基于哈希表的Map接口实现类,它提供了所有可选的映射操作,并允许使用null值和null键。HashMap不保证映射的顺序,特别是它不保证该顺序恒久不变。HashMap的键无序,唯一,类似于Set集合,值有序,类似于...
首先,我们需要获取接口的`Type`对象,然后调用`TypeBuilder.AddInterfaceImplementation`方法添加接口。接下来,为接口中的每个方法生成对应的IL代码,使用`MethodBuilder`构建方法,并指定IL代码。 6. **示例应用...
采用java反射方式 获取requestMapping上所有注解功能实现及取匿名注释类的值及proxy实现获取controller层所有接口注释类信息【匿名注释类信息获取】及解决class com.sun.proxy.$Proxy140 转换报错问题处理等
这两个实现类都使用了Spring的`@Service`注解,标记为Spring管理的bean。`@Service`注解通常用于表示业务层的服务类。在这里,它们分别注入了不同类型的`OAXmlDealHandle`实现,通过`@Resource`注解来指定类型,分别...
这个"匿名内部类实现接口回调"的示例旨在演示如何通过匿名内部类来简化回调函数的实现。下面我们将详细探讨接口回调的概念、匿名内部类的使用以及它们在实际编程中的应用。 首先,让我们理解什么是接口回调。接口回...
接下来,我们创建具体的实现类,例如`ChessGame`或`TicTacToeGame`,它们继承自`Game`抽象类,并提供这些接口的实现。在`ChessGame`中,`start()`可能包含设置棋盘和初始化玩家的逻辑,`playTurn()`处理玩家的每一步...
接口中的方法默认是`public`和`abstract`的,这意味着它们必须被实现类公开并且提供具体实现。此外,接口还可以包含默认方法(自Java 8起)和静态方法,这为接口提供了更多的灵活性。 例如,考虑下面的接口定义: ...
2. **接口实现** 接下来,我们可以创建多个实现`Filter`接口的类。例如,`TimeFilter`是一个实现了`Filter`接口的类,它对传入的参数进行特定的处理。 ```java @Service("timeFilter") public class TimeFilter ...
最近有个需求就是一个抽象仓储层接口方法需要SqlServer以及Oracle两种实现方式,为了灵活我在依赖注入的时候把这两种实现都给注入进了依赖注入容器中,但是在服务调用的时候总是获取到最后注入的那个方法的实现,这...
描述中的"com获取接口,可获取任意程序内结构内容"可能指的是通过COM接口,开发者能够访问并操作其他程序的内部结构。这需要对COM组件的接口有深入理解,包括如何创建、查询和调用接口的方法。在实际应用中,这可能...
通过`NetworkInterface`和`IPInterfaceProperties`类,我们可以轻松地获取接口的名称、类型、状态、IP地址、子网掩码、默认网关以及更多其他信息。这个压缩包提供的代码示例,无疑是一个很好的学习资源,帮助开发者...
在提供的压缩包文件`cookies`中,可能包含了一个接口(定义了Cookie操作的规范),一个实现类(实现了接口中的方法),以及一个测试类(用于测试接口和实现类的功能)。通过查看和运行这些代码,你可以更深入地理解...
`DiskInfo.dcu`很可能包含了实现`IDiskInfo`接口的类,如`TDiskInfo`,这个类实际提供了获取硬盘信息的函数。 `Unit1.pas`是源代码文件,通常包含了程序的主界面或者主要逻辑。在这个项目中,`Unit1`可能是用户界面...