整个测试代码如下:
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; } }运行结果如下:
Java代码 接口实现类: find.test.impl.IntfImpl2 find.test.IntfImpl 子类: find.test.BadMan find.test.impl.GoodMan 目录接口如下: Java代码 src |----find |----ClassUtil.java |----test |----BadMan.java |----impl | |----GoodMan.java | |----IntfImpl2.java |----Intf.java |----IntfImpl.java |----Man.java