`
yangmeng_3331
  • 浏览: 91244 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

给定一个接口返回这个接口所有实现类

    博客分类:
  • Java
阅读更多
package com.dobn.bdgcgl.test;

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 {
	
	/**
	 * 
	 * @author ym
	 * @CreateTime 2013-2-28上午09:51:15
	 * 描述:给一个接口,返回这个接口的所有实现类
	 */
	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 (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return returnClassList;
	}
	
	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;
	}

}

分享到:
评论

相关推荐

    不会实现接口成员

    根据给定的信息,“不会实现接口成员”,我们了解到这是一个与面向对象编程中的接口实现相关的问题。在C#等面向对象语言中,接口是一种定义了类必须实现的方法、属性、索引器或事件的模板。实现接口意味着类必须提供...

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

    通过这段代码,我们可以获取到指定路径下所有实现了给定接口的类或继承了给定类的子类,这对于动态加载和管理类库非常有用。注意,这种方法只适用于文件系统类加载,对于复杂的类加载场景(如网络加载、自定义类加载...

    JDBC常见易用的接口和类

    因此,如果读取一个 ResultSet 与读取另一个交叉,则这两个对象必须是由不同的 Statement 对象生成,如果存在某个语句打开的当前 ResultSet 对象,则 Statement 接口中所有执行方法都会隐式关闭它。 ...

    初学java之接口的一个小程序 Circle Rectangle

    一个类通过实现接口来遵循这个标准,并提供具体的方法实现。 ### 二、示例代码解析 #### 1. 定义接口 `J_Shape` ```java public interface J_Shape { public abstract double mb_getArea(); } ``` - **接口名称...

    编写跑、游泳两个接口

    在Java中,一个类可以继承另一个类,并且可以同时实现多个接口。这样可以充分利用面向对象编程的特性,提高代码的重用性和可维护性。 #### 示例中的类继承与接口实现 - **People 类**: - 继承自 `Animals` 抽象类...

    mongodb的实现类及实现接口(包含jar包)

    例如,`executeQuery`可能返回一个`MongoCursor`,而不是传统的`ResultSet`,`executeUpdate`则可能用于插入、更新或删除操作。 在实际开发中,这样的设计可以帮助开发者利用已有的JDBC经验快速上手MongoDB,并且...

    java抽象类与接口.doc

    在Java中,一个类可以实现多个接口,通过使用`implements`关键字,这体现了Java的多继承特性。接口之间也可以互相继承,以扩展其功能。例如,`Line`类可以实现多个描述几何特性的接口,如`Drawable`和`Measurable`。...

    ArcEngine接口总结

    IField接口主要用于描述表或要素类中的一个字段的信息。它提供了字段的基本属性和一些方法来验证字段值的有效性等操作。 - **AliasName**:只读属性,用于获取字段的别名。 - **CheckValue** 方法:对于指定的属性...

    Java软件开发实战 Java基础与案例开发详解 11-4 List接口实现类 共15页.pdf

    根据给定文件的信息,我们可以提炼出关于Java软件开发中List接口实现类的关键知识点。这部分内容主要聚焦于第11章的“Java集合框架和泛型机制”,特别关注List接口及其几种实现类,包括`ArrayList`、`LinkedList`、`...

    C#后台返回json类型数据

    在这段代码中,首先通过调用`dal_info.GetList`方法来获取数据,并将其存储在一个`DataTable`对象中。 4. **使用JavaScriptSerializer**:`.NET Framework`提供了一个名为`JavaScriptSerializer`的类,用于将.NET...

    java接口的定义和实现接口-java实验报告-报告.doc

    这里`ClassName`接口有一个抽象方法`getClassName()`,没有实现任何具体逻辑,留给实现该接口的类去完成。 2. **接口的实现** 类`Horse`实现了`ClassName`接口: ```java class Horse implements ClassName { ...

    C#_接口多继承.txt

    4. **多接口实现**:一个类可以通过逗号分隔的方式实现多个接口。 ```csharp interface IFace1 { void Method1(); } interface IFace2 { void Method2(); } class MyClass : IFace1, IFace2 { public ...

    C#判断一个类是否实现了某个接口3种实现方法

    C#中的`Type`类提供了`GetInterface()`方法,可以用来查询给定类型的接口实现。以下是一个使用此方法的例子: ```csharp public interface ISay { void SayHello(); } public class B : ISay { public void ...

    PHP实现调用淘宝SDK开放接口返回天猫或淘宝商品详情

    在PHP代码中,可以创建一个配置文件,存储这些敏感信息,并确保其安全。 调用商品详情接口时,通常会使用`taobao.item.get`这个API。此接口用于获取指定ID的商品详情,包括商品标题、价格、图片、库存等信息。使用...

    JSP应用开发-Java集合类-List接口.pptx

    * int lastIndexOf(Object o):List中如果存在多个重复元素,indexOf()方法返回第一个匹配元素的index,lastIndexOf(o)是返回最后一个匹配元素的index * ListIterator listIterator():返回列表中元素的列表迭代器 *...

    Java实验7抽象类和接口.pdf

    此外,我们还创建了一个通用类`Max`,它有一个静态方法`max(Comparable o1, Comparable o2)`,可以接收任何实现了`Comparable`接口的对象,返回两者中较大的一个。 实验的选做题涉及到了多态特性和对象的深复制。...

    java-servlet-api.doc

    ServletContext接口定义了一个Servlet环境对象,这个对象定义了一个在Servlet引擎上的Servlet的视图。通过使用这个对象,Servlet可以记录事件、得到资源并得到来自Servlet引擎的类(例如RequestDispatcher对象)。一...

    PHP接口文档

    接口文档是软件开发中的一个重要组成部分,它详细说明了不同组件或系统如何通过接口进行通信。"PHP接口文档"通常指的是PHP应用程序或服务提供的API(Application Programming Interface)的详细规格说明。 接口文档...

    php二维码生成接口

    这段代码会生成一个基于给定数据的二维码,并直接输出到浏览器。 至于“php二维码生成接口”,当你需要为其他应用或服务提供二维码生成服务时,可以将以上代码封装成一个HTTP接口。一个基本的RESTful API接口可能...

    day12【函数式接口】教案1

    例如,对于给定的问题,可以创建一个`Function, Integer&gt;`接口来实现字符串到年龄的提取和转换,然后用Lambda表达式实现这个功能,最后用另一个`Function`来加上100,达到累加的效果。这样的代码不仅易于理解和测试...

Global site tag (gtag.js) - Google Analytics