1. 程式人生 > >JAVA獲取同一路徑下所有子類或介面實現類

JAVA獲取同一路徑下所有子類或介面實現類

整個測試程式碼如下:

Java程式碼  收藏程式碼
  1. package find;  
  2. import java.io.File;  
  3. import java.io.IOException;  
  4. import java.net.URL;  
  5. import java.util.ArrayList;  
  6. import java.util.List;  
  7. import find.test.Intf;  
  8. import find.test.Man;  
  9. public class ClassUtil {  
  10.     public static void main(String[] args) {  
  11.         try
     {  
  12.             System.out.println("介面實現類:");  
  13.             for (Class<?> c : getAllAssignedClass(Intf.class)) {  
  14.                 System.out.println(c.getName());  
  15.             }  
  16.             System.out.println("子類:");  
  17.             for (Class<?> c : getAllAssignedClass(Man.class)) {  
  18.                 System.out.println(c.getName());  
  19.             }  
  20.         } catch (ClassNotFoundException e) {  
  21.             // TODO Auto-generated catch block  
  22.             e.printStackTrace();  
  23.         } catch (IOException e) {  
  24.             // TODO Auto-generated catch block  
  25.             e.printStackTrace();  
  26.         }  
  27.     }  
  28.     /** 
  29.      * 獲取同一路徑下所有子類或介面實現類 
  30.      *  
  31.      * @param intf 
  32.      * @return 
  33.      * @throws IOException 
  34.      * @throws ClassNotFoundException 
  35.      */  
  36.     public static List<Class<?>> getAllAssignedClass(Class<?> cls) throws IOException,  
  37.             ClassNotFoundException {  
  38.         List<Class<?>> classes = new ArrayList<Class<?>>();  
  39.         for (Class<?> c : getClasses(cls)) {  
  40.             if (cls.isAssignableFrom(c) && !cls.equals(c)) {  
  41.                 classes.add(c);  
  42.             }  
  43.         }  
  44.         return classes;  
  45.     }  
  46.     /** 
  47.      * 取得當前類路徑下的所有類 
  48.      *  
  49.      * @param cls 
  50.      * @return 
  51.      * @throws IOException 
  52.      * @throws ClassNotFoundException 
  53.      */  
  54.     public static List<Class<?>> getClasses(Class<?> cls) throws IOException,  
  55.             ClassNotFoundException {  
  56.         String pk = cls.getPackage().getName();  
  57.         String path = pk.replace('.''/');  
  58.         ClassLoader classloader = Thread.currentThread().getContextClassLoader();  
  59.         URL url = classloader.getResource(path);  
  60.         return getClasses(new File(url.getFile()), pk);  
  61.     }  
  62.     /** 
  63.      * 迭代查詢類 
  64.      *  
  65.      * @param dir 
  66.      * @param pk 
  67.      * @return 
  68.      * @throws ClassNotFoundException 
  69.      */  
  70.     private static List<Class<?>> getClasses(File dir, String pk) throws ClassNotFoundException {  
  71.         List<Class<?>> classes = new ArrayList<Class<?>>();  
  72.         if (!dir.exists()) {  
  73.             return classes;  
  74.         }  
  75.         for (File f : dir.listFiles()) {  
  76.             if (f.isDirectory()) {  
  77.                 classes.addAll(getClasses(f, pk + "." + f.getName()));  
  78.             }  
  79.             String name = f.getName();  
  80.             if (name.endsWith(".class")) {  
  81.                 classes.add(Class.forName(pk + "." + name.substring(0, name.length() - 6)));  
  82.             }  
  83.         }  
  84.         return classes;  
  85.     }  
  86. }  

執行結果如下:

Java程式碼  收藏程式碼
  1. 介面實現類:  
  2. find.test.impl.IntfImpl2  
  3. find.test.IntfImpl  
  4. 子類:  
  5. find.test.BadMan  
  6. find.test.impl.GoodMan  
 目錄介面如下:
Java程式碼  收藏程式碼
  1. src  
  2. |----find  
  3.      |----ClassUtil.java  
  4.      |----test  
  5.           |----BadMan.java  
  6.           |----impl  
  7.           |    |----GoodMan.java  
  8.           |    |----IntfImpl2.java  
  9.           |----Intf.java  
  10.           |----IntfImpl.java  
  11.           |----Man.java