`
daoshud1
  • 浏览: 556634 次
  • 性别: 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获取同一路径下所有子类或接口实现类

    在Java编程中,有时我们需要获取特定路径下所有实现了某个接口或者继承了某个类的子类。这个场景在大型项目中尤为常见,例如进行组件扫描、依赖注入或是单元测试时。在给定的代码示例中,它展示了如何通过Java来实现...

    java 子类对象赋值给父类对象的使用

    1. **方法覆盖**:当子类继承父类并重写父类中的方法时,通过父类引用调用该方法,将执行子类中的版本。这是多态性的一种体现。 2. **构造器与初始化**:子类对象在创建时会先调用父类的构造器,确保父类的状态得到...

    java中接口与抽象类的详细分析与比较

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

    java 泛型接口示例

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

    Java课件-抽象和接口

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

    JAVA接口的介绍

    1. **抽象方法:** 接口中所有的方法都是抽象的,而类中可以包含非抽象的方法。 2. **多继承:** 在Java中,类不能多继承,但一个类可以实现多个接口,这为多继承提供了一种变通的方式。 3. **实现机制:** 类通过...

    JAVA_API1.6文档(中文)

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

    23三种设计模式java实现

    - **模板方法模式**:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。Java中,通过抽象类定义模板方法,子类实现具体步骤。 - **观察者模式**:定义对象间的一对多依赖关系,当一个对象的状态发生改变时,...

    针对接口编程 java示例

    每个具体的鸭子类只需要关注自己如何“走路”(实现接口中的方法),而不关心其他鸭子是如何行动的。这种松耦合使得添加新的鸭子类型变得简单,只需创建一个新的类并实现`Duck`接口即可。 在压缩包文件`DuckMode`中...

    23种设计模式的Java实现

    在Java中,状态通常通过实现接口或继承来切换。 21. **策略模式(Strategy)**:定义一系列算法,把它们一个个封装起来,并使它们可以相互替换。在Java中,策略类通常实现同一个接口,客户端可以根据需要选择策略。...

    常用设计模式java实现

    在Java中,可以定义一个工厂接口和多个实现该接口的具体工厂类。 7. **门面模式**:门面模式为复杂的子系统提供一个简化的统一接口,使得客户端不必了解子系统内部的复杂性。在Java中,门面模式通常用于封装第三方...

    23种设计模式的java实现源代码.rar

    22. **模板方法模式(Template Method)**:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。Java中通过抽象类和具体子类实现。 23. **访问者模式(Visitor)**:表示一个作用于某对象结构中的各元素的操作。...

    java多态的实现

    在这个例子中,可能会有一个抽象类或接口定义了通用的行为,然后有多个子类实现这些行为。通过父类引用指向子类对象,我们可以看到多态的效果。具体的实现细节可以通过查看这个文件来学习。 总之,多态是Java编程中...

    Java1.8API中文手册

    Java 1.8允许在接口中定义默认方法(default methods),默认方法有具体实现,可以避免接口升级时对实现类的修改。同时,接口还可以定义静态方法,为接口提供工具类的功能。 八、并发与多线程 Java 1.8在并发包java...

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

    接口中的方法都是抽象方法,必须由实现该接口的类来实现。一个类可以实现多个接口,但一个类只能继承一个抽象类。 例如,我们可以定义一个接口“InterfaceA”,它有一个抽象方法“methodA()”。 public interface ...

    使用Java实现面向对象编程(Java OOP)

    在Java语言中,面向对象编程得到了广泛的应用,这使得Java成为企业级开发的首选语言之一。下面将详细阐述Java中的面向对象编程知识点。 1. 类与对象 - 类:类是创建对象的模板,定义了对象的属性(数据成员)和...

    设计模式Java版各个实现代码

    Java中的`java.util.Observer`和`java.util.Observable`接口提供了标准的实现。 5. **装饰器模式(Decorator Pattern)**:动态地给一个对象添加一些额外的职责,可以独立增加功能,同时保持接口一致。Java中的IO流...

    java 设计模式 demo

    12. 模板方法模式(Template Method):定义一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 13. 观察者模式(Observer):定义对象间的一对...

    Java Web Service的客户端实现

    Stub需要实现endpoint接口,同时还要实现或继承`javax.xml.rpc.Stub`接口或其子类。`javax.xml.rpc.Stub`接口提供了设置和获取网络通信和认证相关属性的机制,如ENDPOINT_ADDRESS_PROPERTY(服务的互联网地址)、...

    设计模式的Java实现

    12. **模板方法模式**:在一个方法中定义一个算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。Java中,使用抽象类和方法的覆盖实现。 13. **命令模式**:...

Global site tag (gtag.js) - Google Analytics