中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中怎么利用反射獲取某個接口

發布時間:2021-06-18 15:16:31 來源:億速云 閱讀:403 作者:Leah 欄目:大數據

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目錄

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

连州市| 子长县| 松滋市| 修水县| 宜城市| 云霄县| 司法| 桑植县| 卢氏县| 龙泉市| 阜城县| 白银市| 田林县| 阿荣旗| 永丰县| 施秉县| 米泉市| 周宁县| 深圳市| 宜川县| 玛曲县| 清水河县| 都昌县| 宜州市| 江北区| 榆中县| 北川| 布拖县| 兴业县| 沂源县| 明光市| 岳池县| 东山县| 桐庐县| 沙河市| 美姑县| 永泰县| 屏东县| 西宁市| 德清县| 五指山市|