`
yangmeng_3331
  • 浏览: 88060 次
  • 性别: 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++:设计一个结构体struct chainNode,再设计一个具体类 class doubleChain 作为抽象类 class linearList的派生类实现类linearList中的所有方法,外加实现双向迭代器; Java:设计一个接口interface linearList,...

    java-servlet-api.doc

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

    Java基于位置接口实现的双向链表节点类(算法源码)

    * 基于位置接口实现的双向链表节点类 */ package dsa; public class DLNode implements Position { private Object element;//数据对象 private DLNode prev;//指向前驱节点 private DLNode next;//指向后继...

    java中文版API1.6

    所有已知实现类 类/接口声明 类/接口描述 嵌套类摘要 字段摘要 构造方法摘要 方法摘要 字段详细信息 构造方法详细信息 方法详细信息 每个摘要条目都包含该项目的详细描述的第一句。摘要条目按字母顺序排列,而...

    JDK_API_1_6_zh_CN.RAR part1

    所有已知实现类 类/接口声明 类/接口描述 嵌套类摘要 字段摘要 构造方法摘要 方法摘要 字段详细信息 构造方法详细信息 方法详细信息 每个摘要条目都包含该项目的详细描述的第一句。摘要条目按字母顺序排列,而...

    JDK_API_1_6_zh_CN.RAR part2

    所有已知实现类 类/接口声明 类/接口描述 嵌套类摘要 字段摘要 构造方法摘要 方法摘要 字段详细信息 构造方法详细信息 方法详细信息 每个摘要条目都包含该项目的详细描述的第一句。摘要条目按字母顺序排列,而...

    JDK_API_1_6_zh_CN.RAR part3

    所有已知实现类 类/接口声明 类/接口描述 嵌套类摘要 字段摘要 构造方法摘要 方法摘要 字段详细信息 构造方法详细信息 方法详细信息 每个摘要条目都包含该项目的详细描述的第一句。摘要条目按字母顺序排列,而...

    Tomcat6.0_API帮助文档

    所有已知实现类 类/接口声明 类/接口描述 嵌套类摘要 字段摘要 构造函数摘要 方法摘要 字段详细信息 构造函数详细信息 方法详细信息 每个摘要条目都包含该项目的详细描述的第一句。摘要条目按字母顺序排列,而...

    JAVA API 函数详解

    •所有已知实现类 •类/接口声明 •类/接口描述 •嵌套类摘要 •字段摘要 •构造方法摘要 •方法摘要 •字段详细信息 •构造方法详细信息 •方法详细信息 每个摘要条目都包含该项目的详细描述的第一句。摘要...

    java常用工具类的使用

    而在Java类库中有一个Arrays类的sort方法已经实现各种数据类型的排序算法。程序员只需要调用该类的方法即可。 代码演示:Arrays实现排序 public static void main(String[] args) { int[] ages={23, 45,12,76,34,...

    net学习笔记及其他代码应用

    接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它...

    c#学习笔记.txt

    在实现类或结构中定位接口成员的实现的过程称为接口映射。 6,object object 类类型是所有其他类型的最终基类。C# 中的每种类型都是直接或间接从 object 类类型派生的。可以把任何类型的数值给object类型. 7,string...

    Java实现基于内存的搜索引擎设计和实现.zip

    比如在类Index中的getDictionary方法中,需要返回所有保存的Term,可以直接调用map结构的keySet方法返回一个Set对象,包含了所有的键,也即所有的Term,类似的还有由于实现了子类的compareTo以及equal方法,对于子类...

    JAVA面试题最全集

    给定一个C语言函数,要求实现在java类中进行调用。 45.如何获得数组的长度? 46.访问修饰符“public/private/protected/缺省的修饰符”的使用 47.用关键字final修饰一个类或者方法时,有何意义? 48.掌握类和...

    3Java SE(下).doc

    是一个接口,本身不能实例化,我们需要定义一个类实现该接口,并重写其定义的accept方法来定义过滤规则。 accept方法用于定义过滤要求,当给定的file对象满足要求就返回true即可。 重载的listFiles方法: ...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    类是一个蓝图或样板,定义了某种类型的所有对象的变量和方法。 在 java 语言中,Java 程序的基本单位是类,也就是说:一个 Java 程序是由多个类组成 的。定义一个类与定义一个数据类型是有区别的。在程序设计语言中...

    01:详解C#中的反射.pdf

    但它是一个抽象的基类,Type有与每种数据类型对应的派生类,我们使用这个派生类的对象的方法、字段、属性来查找有关该类型的所有信息。 获取给定类型的Type引用有3种常用方式: ●使用 C# typeof 运算符。 Type t...

    jpivot学习总结.doc

    formatter 该属性定义了 Member.getCaption() 方法返回的动作值,这里需要是一个实现了 mondrian.olap.MemberFormatter 接口的类,用来对 Caption 地值进行格式化。 3.6. Join 对于一个 Hierarchy 来说,有两种...

    PHP 面向对象技术(全面讲解).txt

    一个什么样的类,这个类实例化出多少个对象,类里面有多少个属性,有多少个方法等等,这就需 要读者通过在实际的开发中就实际问题分析设计和总结了。 类的定义: class 类名{ } 使用一个关键字class 和后面加上一个你...

    分类整理不同类型的模拟对象

    测试桩实际上是给定接口最简单的实现。例如,测试桩内的方法通常返回硬编码的、无意义的值。 mock类型 描述 测试桩 测试桩实际上是给定接口最简单的...

Global site tag (gtag.js) - Google Analytics