`
cydiay
  • 浏览: 15409 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

获得实现接口的所有Java类

    博客分类:
  • Java
阅读更多
可以由一个接口查找到所有的实现类
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中接口与抽象类的详细分析与比较

    在Java编程语言中,接口(Interface)和抽象类(Abstract Class)都是用于实现多态性的关键概念,它们各自有特定的用途和优缺点。本文将深入探讨这两种概念,帮助你理解它们之间的区别以及如何在实际开发中选择使用...

    针对接口编程 java示例

    当一个类实现接口时,它必须提供这些方法的具体实现。这使得代码可以依赖于接口,而不是具体实现,从而增加了系统的可扩展性和可维护性。 在描述中提到的代码中,可能包括了以下接口和类: 1. `Duck`接口:这个...

    JAVA获取同一路径下所有子类或接口实现类

    - `getAllAssignedClass()`方法通过遍历`getClasses()`返回的所有类,判断每个类是否是目标类(接口或父类)的子类或实现了目标接口,符合条件的加入到结果列表。 通过这段代码,我们可以获取到指定路径下所有实现...

    Java利用接口实现回调

    在Java支持方法指针之前,Java接口不能提供一种实现回调的好方法。如果您习惯于传递在事件驱动编程模型中调用的函数指针,则您会喜欢本技巧。  熟悉MS-Windows和X Window System事件驱动编程模型的开发人员,习惯...

    java资料类,对象和接口

    在实现接口时,类必须提供接口中所有未定义方法的具体实现。例如,`Television`、`Computer`和`Mobile`都实现了`ComputeTotalSales`接口,所以它们都有`totalSalesByYear()`方法。 4. 多重继承: 通过接口,Java...

    JAVA中间接口转发DEMO

    在Java开发中,中间接口转发(Middleware Interface Forwarding)是一种常见的设计模式,它主要用于实现业务逻辑的解耦和系统的稳定性。这个DEMO展示了如何在Java中构建这样的中间层,以应对第三方API可能出现的问题...

    JAVA接口的介绍

    3. **实现机制:** 类通过继承可以访问父类的所有非私有成员,而接口的实现只能获得接口中的方法签名,无法访问其实现细节。 #### 接口的实现示例 以下是一个简单的接口实现示例,展示了如何使用接口来处理不同的...

    java后台实现支付宝支付接口和支付宝订单查询接口(前端为APP)

    Java后台实现支付宝支付接口和支付宝订单查询接口 本文主要介绍了Java后台实现支付宝支付接口和支付宝订单查询接口的详细过程,旨在帮助开发者快速实现支付宝支付功能。 一、申请公司企业账号并开通应用 首先,...

    java 泛型接口示例

    泛型接口是泛型在接口中的应用,它允许我们在接口中定义带有类型参数的方法,使得实现该接口的类可以使用不同的数据类型。下面我们将详细探讨Java泛型接口的相关知识点。 1. **泛型接口的定义** 泛型接口的定义...

    JAVA_API1.6文档(中文)

    java.awt 包含用于创建用户界面和绘制图形图像的所有类。 java.awt.color 提供用于颜色空间的类。 java.awt.datatransfer 提供在应用程序之间和在应用程序内部传输数据的接口和类。 java.awt.dnd Drag 和 Drop 是...

    基于Java的接口快速开发框架

    在这个框架中,开发者无需手动编写Controller、Service、Dao、Mapper、XML以及VO等常见的Java对象,就能实现接口的快速构建。 首先,我们来了解核心组件magic-api。Magic-api是一个强大的Java接口开发工具,它提供...

    Java课件-抽象和接口

    实现接口的类必须提供接口中所有方法的具体实现,例如: ```java public class Piano implements Instrument { public void play() { System.out.println("Playing the piano..."); } } ``` 接口在软件设计中起...

    Java抽象类和接口和继承之间关系

    "Java抽象类和接口和继承之间关系" Java抽象类和接口是两种不同的概念,它们之间存在着继承关系。在Java中,抽象类(abstract class)和接口(interface)都是用来描述对象的行为和状态的,但它们之间有着明显的...

    java集合类线程安全.doc

    实现该接口的集合类包括三个通用实现类哈希集合类、树集合类和链接哈希集合类。 2. 列表接口 列表是一种有序的元素集合。实现该接口的集合类包括数组链表类和链接链表类。 3. 队列接口 队列是一种先进先出的数据...

    Java类思维导图

    一个类可以继承自另一个类,从而获得父类的所有非私有成员。这有助于代码重用,并允许我们创建层次化的类结构。单继承是Java的一个特点,即一个类只能直接继承一个父类,但可以通过接口实现多继承的效果。接口在Java...

    java调用AutoCAD接口绘图工具类

    利用Jacob调用AutoCAD接口绘图,实现绘制图形,不是调用Windows绘制图形界面,是真正的调用AutoCAD绘图,只是给了测试代码,具体功能自己摸索

    Java--类的继承

    - 接口的实现意味着类必须提供接口中所有抽象方法的具体实现。 8. 抽象类的使用: - 抽象类是不能实例化的类,它可能包含抽象方法(没有实现的方法)。使用`abstract`关键字定义,如`abstract class Abstract...

    Java中继承thread类与实现Runnable接口的比较

    Java 中继承 Thread 类与实现 Runnable 接口的比较 在 Java 中,创建线程有两种方式:继承 Thread 类和实现 Runnable 接口。这些方式都可以用来创建线程,但它们之间有着一些关键的区别。 继承 Thread 类 继承 ...

    java RMI实现代码

    2. 远程对象:实现了远程接口的类,代表实际执行远程方法的实体,需要继承`java.rmi.Remote`并实现接口中的所有方法。 3. RMIServer:服务器端程序,负责注册远程对象到RMI注册表,使得客户端可以通过名称查找并调用...

Global site tag (gtag.js) - Google Analytics