`
daoshud1
  • 浏览: 550325 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Java中如何获得所有实现该接口的子类

    博客分类:
  • java
 
阅读更多
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")) {
				// 去掉'.class'
				classes.add(Class.forName(packageName
						+ '.'
						+ file.getName().substring(0,
								file.getName().length() - 6)));

			}
		}
		return classes;
	}
出处:[url]http://hi.baidu.com/mengfanbo19876/item/076a741267d85c0a1894ecd1[/url]
分享到:
评论

相关推荐

    JAVA_API1.6文档(中文)

    java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java....

    Java抽象类和接口的深度解析.pptx.pptx

    接口可以被多个类实现,通过实现接口,类可以获得接口中定义的所有方法和常量。 抽象类和接口的区别 抽象类和接口都是用于定义通用属性和方法的,但抽象类可以有构造方法,接口不能有。抽象类只能单继承,接口可以...

    JavaAPI1.6中文chm文档 part1

    java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java....

    Java 1.6 API 中文 New

    java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java.nio ...

    java api最新7.0

    java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java.nio ...

    JavaAPI中文chm文档 part2

    java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java....

    java jdk-api-1.6 中文 chmd

    java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java....

    JAVA面试题最全集

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

    java 面试题 总结

    取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。 接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,...

    Java中使用接口实现多继承和多态的方法

    这样用父类的变量去引用不同的子类,在调用这个相同的方法print()的时候得到的结果和表现形式就不一样了,这就是多态,相同的消息(也就是调用相同的方法)会有不同的结果。举例说明:  //父类  public class ...

    JAVA多媒体开发手册 JMF API

    JAVA多媒体开发手册,Java多媒体框架(JMF)中包含了许多用于处理多媒体的API。它是一个相当复杂的系统,完全了解这个系统可能需要花上几周的时间,但是这篇文章将主要介绍JMF的几个核心接口和类,然后通过一个简单...

    [Java参考文档]

    java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java....

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    基本信息 作者: 臧萌 ...12.2.4 使用接口仅需一步——实现接口 342 12.2.5 接口——让类集多重类型于一身 344 12.2.6 简化recordTransport()方法 347 12.3 再探接口 349 12.3.1 重温上节中的程序 349...

    《Java程序设计案例教程》教学课件05深入Java面向对象.pptx

    能够在MyEclipse IDE中定义接口及定义类实现接口。 《Java程序设计案例教程》教学课件05深入Java面向对象全文共47页,当前为第3页。 5.1 回顾与思考 在模块4我们以Circle类为例,从类的定义入手,详细分析了类的构成...

    超级有影响力霸气的Java面试题大全文档

    取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。  接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的...

    [Java参考文档].JDK_API 1.6

    java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java.nio ...

Global site tag (gtag.js) - Google Analytics