您好,登錄后才能下訂單哦!
Java中怎么利用反射獲取某個接口,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
/**
* 獲取一個接口的所有實現類 * * @param target * @return */ public static ArrayList<Class<?>> getInterfaceImpls(Class<?> target) { ArrayList<Class<?>> subclassaes = Lists.newArrayList(); try { // 判斷class對象是否是一個接口 if (target.isInterface()) { @NotNull String basePackage = target.getClassLoader().getResource("").getPath(); File[] files = new File(basePackage).listFiles(); // 存放class路徑的list ArrayList<String> classpaths = Lists.newArrayList(); for (File file : files) { // 掃描項目編譯后的所有類 if (file.isDirectory()) { listPackages(file.getName(), classpaths); } } // 獲取所有類,然后判斷是否是 target 接口的實現類 for (String classpath : classpaths) { Class<?> classObject = Class.forName(classpath); if (classObject.getSuperclass() == null) continue; // 判斷該對象的父類是否為null Set<Class<?>> interfaces = new HashSet<>(Arrays.asList(classObject.getInterfaces())); if (interfaces.contains(target)) { subclasses.add(Class.forName(classObject.getName())); } } } else { throw new ParamException("Class對象不是一個interface"); } } catch (Throwable e) { e.printStackTrace(); } return subclasses; } /** * 獲取項目編譯后的所有的.class的字節碼文件 * 這么做的目的是為了讓 Class.forName() 可以加載類 * * @param basePackage 默認包名 * @param classes 存放字節碼文件路徑的集合 * @return */ public static void listPackages(String basePackage, List<String> classes) { URL url = SophonUtils.class.getClassLoader() .getResource("./" + basePackage.replaceAll("\\.", "/")); File directory = new File(url.getFile()); for (File file : directory.listFiles()) { // 如果是一個目錄就繼續往下讀取(遞歸調用) if (file.isDirectory()) { listPackages(basePackage + "." + file.getName(), classes); } else { // 如果不是一個目錄,判斷是不是以.class結尾的文件,如果不是則不作處理 String classpath = file.getName(); if (".class".equals(classpath.substring(classpath.length() - ".class".length()))) { classes.add(basePackage + "." + classpath.replaceAll(".class", "")); } } } }
代碼演示:
使用方法非常簡單,你只需要調用getInterfaceImpls()方法即可,listPackages()方法是個輔助。
// // getInstanceImpls()返回一個Class<?>對象數組 // 這個數組中包含的數據就是SophonInit接口的子類 // ArrayList<Class<?>> subclass = getInterfaceImpls(SophonInit.class);
ps:值的注意的地方是,這個方法只能獲取項目中自己定義的接口,不能獲取到JDK或者是其他Jar包中的接口,因為這個工具的原理就是掃描編譯后的classes目錄
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。