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

    xiaoxiao2022-06-28  34

    整个测试代码如下:

    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  
    转载请注明原文地址: https://ju.6miu.com/read-1124240.html

    最新回复(0)