`
kinkding
  • 浏览: 150175 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

    博客分类:
  • JAVA
阅读更多

整个测试代码如下:

package find;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import find.test.Intf;
import find.test.Man;

public class ClassUtil {
	public static void main(String[] args) {
		try {
			System.out.println("接口实现类:");
			for (Class<?> c : getAllAssignedClass(Intf.class)) {
				System.out.println(c.getName());
			}
			System.out.println("子类:");
			for (Class<?> c : getAllAssignedClass(Man.class)) {
				System.out.println(c.getName());
			}
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 获取同一路径下所有子类或接口实现类
	 * 
	 * @param intf
	 * @return
	 * @throws IOException
	 * @throws ClassNotFoundException
	 */
	public static List<Class<?>> getAllAssignedClass(Class<?> cls) throws IOException,
			ClassNotFoundException {
		List<Class<?>> classes = new ArrayList<Class<?>>();
		for (Class<?> c : getClasses(cls)) {
			if (cls.isAssignableFrom(c) && !cls.equals(c)) {
				classes.add(c);
			}
		}
		return classes;
	}

	/**
	 * 取得当前类路径下的所有类
	 * 
	 * @param cls
	 * @return
	 * @throws IOException
	 * @throws ClassNotFoundException
	 */
	public static List<Class<?>> getClasses(Class<?> cls) throws IOException,
			ClassNotFoundException {
		String pk = cls.getPackage().getName();
		String path = pk.replace('.', '/');
		ClassLoader classloader = Thread.currentThread().getContextClassLoader();
		URL url = classloader.getResource(path);
		return getClasses(new File(url.getFile()), pk);
	}

	/**
	 * 迭代查找类
	 * 
	 * @param dir
	 * @param pk
	 * @return
	 * @throws ClassNotFoundException
	 */
	private static List<Class<?>> getClasses(File dir, String pk) throws ClassNotFoundException {
		List<Class<?>> classes = new ArrayList<Class<?>>();
		if (!dir.exists()) {
			return classes;
		}
		for (File f : dir.listFiles()) {
			if (f.isDirectory()) {
				classes.addAll(getClasses(f, pk + "." + f.getName()));
			}
			String name = f.getName();
			if (name.endsWith(".class")) {
				classes.add(Class.forName(pk + "." + name.substring(0, name.length() - 6)));
			}
		}
		return classes;
	}

}
 

运行结果如下:

接口实现类:
find.test.impl.IntfImpl2
find.test.IntfImpl
子类:
find.test.BadMan
find.test.impl.GoodMan
 目录接口如下:
src
|----find
     |----ClassUtil.java
     |----test
          |----BadMan.java
          |----impl
          |    |----GoodMan.java
          |    |----IntfImpl2.java
          |----Intf.java
          |----IntfImpl.java
          |----Man.java
 
分享到:
评论
1 楼 mike65lp 2010-12-09  
谢谢!It works!
但是还有一个问题:
当把项目打包成jar后,再放到web project的lib文件夹下面,以下的第二行就会放生NullPointerException:
        URL url = classloader.getResource(path);  
        return getClasses(new File(url.getFile()), pk); 

因为当打包成jar包之后,对象url已经是null了。
请问各位大牛,有什么解决方法?

相关推荐

    JAVA读取同一路径下所有类及其方法

    这个类中有一个 `getAllAssignedClass` 方法,用于获取同一路径下所有子类或接口实现类。这个方法使用 `getClasses` 方法来获取当前类路径下的所有类,然后过滤出继承自 `com.post.common.BaseAction` 的类。 ...

    Java技术----实现JAVA的动态类载入机制

    动态类加载机制的核心在于`java.lang.ClassLoader`类及其子类。开发者可以通过重写`loadClass(String className)`方法来自定义加载逻辑。当调用`Class.forName()`或`ClassLoader.loadClass()`时,JVM会使用类加载器...

    Java虚拟机类装载的原理及实现

    在JVM中,类的装载是由`ClassLoader`及其子类实现的。`ClassLoader`是Java运行时系统的一个核心组件,负责查找和装入类文件。 - **`ClassLoader`**:这是Java中的一个抽象类,定义了几个关键的方法来支持类的装载。...

    Java加载。jar包

    它是子类 `ClassLoader` 需要重写的关键方法之一,目的是实现类的自定义加载逻辑。 3. **`defineClass` 方法**: - `defineClass` 方法用于将字节码转换为 `Class` 对象。它处理了许多复杂的内部细节,例如解析...

    达内core_java学习笔记

    集合框架是Java处理对象组的一种方式,包括List、Set和Map等接口,以及ArrayList、HashSet、HashMap等实现类。理解这些集合的特点和使用场景,是提升编程效率的关键。 七、IO流 Java的输入/输出(IO)流系统支持对...

    JAVA基础入门到精通pdf

    10. **多线程**:Java内置对多线程的支持,通过Thread类或Runnable接口实现并发执行。同步机制如synchronized关键字、wait/notify机制防止并发问题。 11. **网络编程**:Java提供了丰富的网络编程API,如Socket和...

    详细的java基础总结

    `Collection`接口是最基本的容器接口,所有的单列集合类都是它的实现类。`Collection`接口的主要子接口有`Set`和`List`。 - **Collection接口常用方法** `Collection`接口定义了一些基本的方法,如`add()`、`...

    Java3y.zip

    多态是指同一种行为可以有不同的表现形式,这在Java中通过接口和抽象类实现。 5. **异常处理**:Java使用try-catch-finally语句块进行异常处理,使得程序在遇到错误时能优雅地处理,而不是突然崩溃。 6. **集合...

    java全集.pdf JAVA全集

    - **集合类层次**:`List`、`Set`、`Map`等接口的具体实现类。 - **五个最常用的集合类之间的区别和联系**:ArrayList、LinkedList、HashSet、TreeSet、HashMap。 - **比较**:根据具体需求选择合适的集合类。 **...

    Java面向对象程序设计耿祥义版课件

    Java集合框架包括List、Set、Queue等接口及其实现类,如ArrayList、HashSet、LinkedList等,它们提供了存储和操作对象的高效工具。 六、设计模式 面向对象设计模式是解决常见问题的最佳实践,如单例模式、工厂模式...

    java的精髓.txt

    接口可以被类实现,实现类必须提供接口中所有方法的具体实现。接口可以看作是类之间的一种约定,规定了某些方法的行为规范。 #### 七、Java反射机制 - **反射**:Java反射机制允许在运行时获取类的信息(如字段、...

    加载同一类型但是版本不同JDBC驱动

    在Java编程中,数据库连接是通过Java Database Connectivity (JDBC) API实现的,它提供了一组接口和类,使得Java程序能够与各种数据库进行交互。然而,不同的数据库版本可能需要不同版本的JDBC驱动,这可能导致兼容...

    java方向面试宝典.pdf

    public允许所有类访问,private限制在同一类内访问,protected允许同一包内及子类访问,而默认修饰符只允许同一包内的类访问。 Java多线程编程主要通过实现Runnable接口或继承Thread类来创建线程。Java泛型提高了...

    Java 基础核心总结

    Java中的所有异常都继承自Throwable类,它有两个主要子类:Error和Exception。Error表示严重的错误,通常是系统错误,而Exception则表示可恢复的错误。通过try、catch、finally语句和throws关键字,可以对异常进行...

    黑马程序员入学Java精华总结

    - 继承`Thread`类或实现`Runnable`接口。 3. **两种进程创建方式比较** - 继承`Thread`类可以直接访问和修改线程属性。 - 实现`Runnable`接口更灵活,可以被多个线程共享。 4. **线程的生命周期** - 线程的...

    JAVA程序员笔试面试题汇总及答案.pdf,这是一份不错的文件

    * 历史原因:Hashtable 基于陈旧的 Dictionary 类,HashMap 是 Java 1.2 引进的 Map 接口的一个实现 * 同步性:Hashtable 是线程安全的,HashMap 是线程不安全的 * 值:只有 HashMap 可以让你将空值作为一个表的条目...

    Java编程的逻辑

    7. **集合框架**:Java集合框架包括List、Set、Queue和Map等接口,以及ArrayList、HashSet、LinkedList、HashMap等实现类,用于存储和管理对象。理解它们的区别和应用场景是Java编程的关键。 8. **输入输出流**:...

    java初级chap05(ppt文档).ppt

    多态性则是指同一种行为可以有不同的表现形式,这在Java中通过接口和抽象类实现。接口是一种完全抽象的类型,它只包含常量和抽象方法,可以被多个类实现。实现接口的类必须提供接口中所有方法的具体实现。抽象类则...

Global site tag (gtag.js) - Google Analytics