Java中怎么利用反射獲取某個(gè)接口,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),汪清企業(yè)網(wǎng)站建設(shè),汪清品牌網(wǎng)站建設(shè),網(wǎng)站定制,汪清網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,汪清網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
/**
* 獲取一個(gè)接口的所有實(shí)現(xiàn)類(lèi) * * @param target * @return */ public static ArrayList<Class<?>> getInterfaceImpls(Class<?> target) { ArrayList<Class<?>> subclassaes = Lists.newArrayList(); try { // 判斷class對(duì)象是否是一個(gè)接口 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) { // 掃描項(xiàng)目編譯后的所有類(lèi) if (file.isDirectory()) { listPackages(file.getName(), classpaths); } } // 獲取所有類(lèi),然后判斷是否是 target 接口的實(shí)現(xiàn)類(lèi) for (String classpath : classpaths) { Class<?> classObject = Class.forName(classpath); if (classObject.getSuperclass() == null) continue; // 判斷該對(duì)象的父類(lèi)是否為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對(duì)象不是一個(gè)interface"); } } catch (Throwable e) { e.printStackTrace(); } return subclasses; } /** * 獲取項(xiàng)目編譯后的所有的.class的字節(jié)碼文件 * 這么做的目的是為了讓 Class.forName() 可以加載類(lèi) * * @param basePackage 默認(rèn)包名 * @param classes 存放字節(jié)碼文件路徑的集合 * @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()) { // 如果是一個(gè)目錄就繼續(xù)往下讀取(遞歸調(diào)用) if (file.isDirectory()) { listPackages(basePackage + "." + file.getName(), classes); } else { // 如果不是一個(gè)目錄,判斷是不是以.class結(jié)尾的文件,如果不是則不作處理 String classpath = file.getName(); if (".class".equals(classpath.substring(classpath.length() - ".class".length()))) { classes.add(basePackage + "." + classpath.replaceAll(".class", "")); } } } }
代碼演示:
使用方法非常簡(jiǎn)單,你只需要調(diào)用getInterfaceImpls()方法即可,listPackages()方法是個(gè)輔助。
// // getInstanceImpls()返回一個(gè)Class<?>對(duì)象數(shù)組 // 這個(gè)數(shù)組中包含的數(shù)據(jù)就是SophonInit接口的子類(lèi) // ArrayList<Class<?>> subclass = getInterfaceImpls(SophonInit.class);
ps:值的注意的地方是,這個(gè)方法只能獲取項(xiàng)目中自己定義的接口,不能獲取到JDK或者是其他Jar包中的接口,因?yàn)檫@個(gè)工具的原理就是掃描編譯后的classes目錄
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。
網(wǎng)站題目:Java中怎么利用反射獲取某個(gè)接口
URL標(biāo)題:http://vcdvsql.cn/article4/podcie.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、搜索引擎優(yōu)化、定制開(kāi)發(fā)、品牌網(wǎng)站設(shè)計(jì)、云服務(wù)器、App設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容