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

来源:互联网 发布:实时油价查询软件 编辑:程序博客网 时间:2024/06/07 00:22
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

0 0
原创粉丝点击