JAVA獲取同一路徑下所有子類或介面實現類
阿新 • • 發佈:2019-02-03
整個測試程式碼如下:
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