可以由一个接口查找到所有的实现类
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
public class ClassUtils {
// 给一个接口,返回这个接口的所有实现类
public static List<Class<?>> getAllClassByInterface(Class<?> c) {
List<Class<?>> returnClassList = new ArrayList<Class<?>>(); // 返回结果
// 如果不是一个接口,则不做处理
if (c.isInterface()) {
String packageName = c.getPackage().getName(); // 获得当前的包名
try {
List<Class<?>> allClass = getClasses(packageName); // 获得当前包下以及子包下的所有类
// 判断是否是同一个接口
for (int i = 0; i < allClass.size(); i++) {
if (c.isAssignableFrom(allClass.get(i))) { // 判断是不是一个接口
if (!c.equals(allClass.get(i))) { // 本身不加进去
returnClassList.add(allClass.get(i));
}
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return returnClassList;
}
// 从一个包中查找出所有的类,在jar包中不能查找
private static List<Class<?>> getClasses(String packageName)
throws ClassNotFoundException, IOException {
ClassLoader classLoader = Thread.currentThread()
.getContextClassLoader();
String path = packageName.replace('.', '/');
Enumeration<URL> resources = classLoader.getResources(path);
List<File> dirs = new ArrayList<File>();
while (resources.hasMoreElements()) {
URL resource = resources.nextElement();
dirs.add(new File(resource.getFile()));
}
ArrayList<Class<?>> classes = new ArrayList<Class<?>>();
for (File directory : dirs) {
classes.addAll(findClasses(directory, packageName));
}
return classes;
}
private static List<Class<?>> findClasses(File directory, String packageName)
throws ClassNotFoundException {
List<Class<?>> classes = new ArrayList<Class<?>>();
if (!directory.exists()) {
return classes;
}
File[] files = directory.listFiles();
for (File file : files) {
if (file.isDirectory()) {
assert !file.getName().contains(".");
classes.addAll(findClasses(file,
packageName + "." + file.getName()));
} else if (file.getName().endsWith(".class")) {
classes.add(Class.forName(packageName
+ '.'
+ file.getName().substring(0,
file.getName().length() - 6)));
}
}
return classes;
}
}
分享到:
相关推荐
在Java编程语言中,接口(Interface)和抽象类(Abstract Class)都是用于实现多态性的关键概念,它们各自有特定的用途和优缺点。本文将深入探讨这两种概念,帮助你理解它们之间的区别以及如何在实际开发中选择使用...
当一个类实现接口时,它必须提供这些方法的具体实现。这使得代码可以依赖于接口,而不是具体实现,从而增加了系统的可扩展性和可维护性。 在描述中提到的代码中,可能包括了以下接口和类: 1. `Duck`接口:这个...
- `getAllAssignedClass()`方法通过遍历`getClasses()`返回的所有类,判断每个类是否是目标类(接口或父类)的子类或实现了目标接口,符合条件的加入到结果列表。 通过这段代码,我们可以获取到指定路径下所有实现...
在Java支持方法指针之前,Java接口不能提供一种实现回调的好方法。如果您习惯于传递在事件驱动编程模型中调用的函数指针,则您会喜欢本技巧。 熟悉MS-Windows和X Window System事件驱动编程模型的开发人员,习惯...
在实现接口时,类必须提供接口中所有未定义方法的具体实现。例如,`Television`、`Computer`和`Mobile`都实现了`ComputeTotalSales`接口,所以它们都有`totalSalesByYear()`方法。 4. 多重继承: 通过接口,Java...
在Java开发中,中间接口转发(Middleware Interface Forwarding)是一种常见的设计模式,它主要用于实现业务逻辑的解耦和系统的稳定性。这个DEMO展示了如何在Java中构建这样的中间层,以应对第三方API可能出现的问题...
3. **实现机制:** 类通过继承可以访问父类的所有非私有成员,而接口的实现只能获得接口中的方法签名,无法访问其实现细节。 #### 接口的实现示例 以下是一个简单的接口实现示例,展示了如何使用接口来处理不同的...
Java后台实现支付宝支付接口和支付宝订单查询接口 本文主要介绍了Java后台实现支付宝支付接口和支付宝订单查询接口的详细过程,旨在帮助开发者快速实现支付宝支付功能。 一、申请公司企业账号并开通应用 首先,...
泛型接口是泛型在接口中的应用,它允许我们在接口中定义带有类型参数的方法,使得实现该接口的类可以使用不同的数据类型。下面我们将详细探讨Java泛型接口的相关知识点。 1. **泛型接口的定义** 泛型接口的定义...
java.awt 包含用于创建用户界面和绘制图形图像的所有类。 java.awt.color 提供用于颜色空间的类。 java.awt.datatransfer 提供在应用程序之间和在应用程序内部传输数据的接口和类。 java.awt.dnd Drag 和 Drop 是...
在这个框架中,开发者无需手动编写Controller、Service、Dao、Mapper、XML以及VO等常见的Java对象,就能实现接口的快速构建。 首先,我们来了解核心组件magic-api。Magic-api是一个强大的Java接口开发工具,它提供...
实现接口的类必须提供接口中所有方法的具体实现,例如: ```java public class Piano implements Instrument { public void play() { System.out.println("Playing the piano..."); } } ``` 接口在软件设计中起...
"Java抽象类和接口和继承之间关系" Java抽象类和接口是两种不同的概念,它们之间存在着继承关系。在Java中,抽象类(abstract class)和接口(interface)都是用来描述对象的行为和状态的,但它们之间有着明显的...
实现该接口的集合类包括三个通用实现类哈希集合类、树集合类和链接哈希集合类。 2. 列表接口 列表是一种有序的元素集合。实现该接口的集合类包括数组链表类和链接链表类。 3. 队列接口 队列是一种先进先出的数据...
一个类可以继承自另一个类,从而获得父类的所有非私有成员。这有助于代码重用,并允许我们创建层次化的类结构。单继承是Java的一个特点,即一个类只能直接继承一个父类,但可以通过接口实现多继承的效果。接口在Java...
利用Jacob调用AutoCAD接口绘图,实现绘制图形,不是调用Windows绘制图形界面,是真正的调用AutoCAD绘图,只是给了测试代码,具体功能自己摸索
- 接口的实现意味着类必须提供接口中所有抽象方法的具体实现。 8. 抽象类的使用: - 抽象类是不能实例化的类,它可能包含抽象方法(没有实现的方法)。使用`abstract`关键字定义,如`abstract class Abstract...
Java 中继承 Thread 类与实现 Runnable 接口的比较 在 Java 中,创建线程有两种方式:继承 Thread 类和实现 Runnable 接口。这些方式都可以用来创建线程,但它们之间有着一些关键的区别。 继承 Thread 类 继承 ...
2. 远程对象:实现了远程接口的类,代表实际执行远程方法的实体,需要继承`java.rmi.Remote`并实现接口中的所有方法。 3. RMIServer:服务器端程序,负责注册远程对象到RMI注册表,使得客户端可以通过名称查找并调用...