`
buaixianchen
  • 浏览: 24099 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

获取接口的所有实现类

阅读更多
/**
	 * 获取接口的所有实现类
	 * @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 获取接口所有实现类的方式详解是 Java 编程中的一种常见...如果项目中使用了 Spring,可以使用 Spring 容器来获取接口实现类。如果没有使用 Spring,可以使用 ServiceLoader。

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

    - `Intf`是示例中的接口,`Man`是它的实现类。`isAssignableFrom()`方法用于检查`Class`对象表示的类或接口是否可以被`cls`表示的类或接口赋值。如果`Man`是`Intf`的实现,则`Intf.isAssignableFrom(Man.class)`...

    Java动态获取实现某个接口下所有的实现类对象集合

    Java动态获取实现某个接口下所有的实现类对象集合 Java 中动态获取实现某个接口下所有的实现类对象集合是一个常见的需求,特别是在基于接口编程的开发模式中。这篇文章将向大家分享如何使用 Java 反射机制和第三方...

    子接口及其实现类PPT实用.pptx

    本节将深入探讨`Collection`接口及其常用的子接口与实现类。 首先,`Collection`接口概述:它是Java集合框架的根接口,定义了集合的基本操作,如添加、删除和遍历元素。所有集合类都直接或间接地继承自`Collection`...

    扫描接口实现类

    在Java开发中,"扫描接口实现类"是一个常见的需求,特别是在框架或库的初始化阶段,需要自动发现并加载实现了特定接口的类。这个过程通常涉及到类路径扫描和反射技术。以下将详细介绍这一知识点。 首先,我们需要...

    thread 线程类 实现runnable接口

    Runnable 接口的实现类需要重写 run() 方法以提供线程的执行逻辑。 2. Thread 类 Thread 类是 Runnable 接口的实现类,它提供了线程的基本操作和管理。Thread 类包含了线程的状态、线程 ID、线程属性、线程优先级...

    Java Map接口及其实现类原理解析

    HashMap是基于哈希表的Map接口实现类,它提供了所有可选的映射操作,并允许使用null值和null键。HashMap不保证映射的顺序,特别是它不保证该顺序恒久不变。HashMap的键无序,唯一,类似于Set集合,值有序,类似于...

    动态实现接口

    首先,我们需要获取接口的`Type`对象,然后调用`TypeBuilder.AddInterfaceImplementation`方法添加接口。接下来,为接口中的每个方法生成对应的IL代码,使用`MethodBuilder`构建方法,并指定IL代码。 6. **示例应用...

    requestMapping上所有注解功能实现及取匿名注释类的值及proxy实现获取controller层所有接口注释类信息

    采用java反射方式 获取requestMapping上所有注解功能实现及取匿名注释类的值及proxy实现获取controller层所有接口注释类信息【匿名注释类信息获取】及解决class com.sun.proxy.$Proxy140 转换报错问题处理等

    5. 多个service实现同一个接口 或者抽象类 1

    这两个实现类都使用了Spring的`@Service`注解,标记为Spring管理的bean。`@Service`注解通常用于表示业务层的服务类。在这里,它们分别注入了不同类型的`OAXmlDealHandle`实现,通过`@Resource`注解来指定类型,分别...

    匿名内部类实现接口回调

    这个"匿名内部类实现接口回调"的示例旨在演示如何通过匿名内部类来简化回调函数的实现。下面我们将详细探讨接口回调的概念、匿名内部类的使用以及它们在实际编程中的应用。 首先,让我们理解什么是接口回调。接口回...

    C++编程接口与实现的分离实例

    接下来,我们创建具体的实现类,例如`ChessGame`或`TicTacToeGame`,它们继承自`Game`抽象类,并提供这些接口的实现。在`ChessGame`中,`start()`可能包含设置棋盘和初始化玩家的逻辑,`playTurn()`处理玩家的每一步...

    Java接口和内部类教程

    接口中的方法默认是`public`和`abstract`的,这意味着它们必须被实现类公开并且提供具体实现。此外,接口还可以包含默认方法(自Java 8起)和静态方法,这为接口提供了更多的灵活性。 例如,考虑下面的接口定义: ...

    spring注解识别一个接口的多个实现类方法

    2. **接口实现** 接下来,我们可以创建多个实现`Filter`接口的类。例如,`TimeFilter`是一个实现了`Filter`接口的类,它对传入的参数进行特定的处理。 ```java @Service("timeFilter") public class TimeFilter ...

    .NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了

    最近有个需求就是一个抽象仓储层接口方法需要SqlServer以及Oracle两种实现方式,为了灵活我在依赖注入的时候把这两种实现都给注入进了依赖注入容器中,但是在服务调用的时候总是获取到最后注入的那个方法的实现,这...

    com获取接口 ie密码

    描述中的"com获取接口,可获取任意程序内结构内容"可能指的是通过COM接口,开发者能够访问并操作其他程序的内部结构。这需要对COM组件的接口有深入理解,包括如何创建、查询和调用接口的方法。在实际应用中,这可能...

    c# 获取网络接口的配置信息

    通过`NetworkInterface`和`IPInterfaceProperties`类,我们可以轻松地获取接口的名称、类型、状态、IP地址、子网掩码、默认网关以及更多其他信息。这个压缩包提供的代码示例,无疑是一个很好的学习资源,帮助开发者...

    cookie接口 实现本地或客户端的cookie的创建和读取

    在提供的压缩包文件`cookies`中,可能包含了一个接口(定义了Cookie操作的规范),一个实现类(实现了接口中的方法),以及一个测试类(用于测试接口和实现类的功能)。通过查看和运行这些代码,你可以更深入地理解...

    获取硬盘信息接口

    `DiskInfo.dcu`很可能包含了实现`IDiskInfo`接口的类,如`TDiskInfo`,这个类实际提供了获取硬盘信息的函数。 `Unit1.pas`是源代码文件,通常包含了程序的主界面或者主要逻辑。在这个项目中,`Unit1`可能是用户界面...

Global site tag (gtag.js) - Google Analytics