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

整个测试代码如下:

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

运行结果如下:

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  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值