Java如何獲取接口所有的實(shí)現(xiàn)類
Java獲取接口所有的實(shí)現(xiàn)類
最近因業(yè)務(wù)需求,要實(shí)現(xiàn)NodeRed服務(wù)后端化,為使各個節(jié)點(diǎn)的解析進(jìn)行插件化(NodeRed各個節(jié)點(diǎn)也是插件化,安裝插件即可使用) ,后端不得不動態(tài)加載解析NodeRed節(jié)點(diǎn)json,用一個接口來統(tǒng)一管理。
import cn.hutool.core.util.ClassUtil;
import java.util.*;
/**
* 此類用來解析NodeRed服務(wù)器的json串
*/
public class NodeRedParseUtil {
public static void main(String[] args) throws IllegalAccessException, InstantiationException {
//獲取所有的模型實(shí)現(xiàn)類
Set<Class<?>> classes = ClassUtil.scanPackageBySuper("com.ciih.nodred.plugins", NodeRedModel.class);
Map<String, NodeRedModel> map = new HashMap<>(classes.size());
for (Class<?> aClass : classes) {
//實(shí)例化
Object o = aClass.newInstance();
System.out.println();
if (o instanceof NodeRedModel) {
NodeRedModel nodeRedModel = (NodeRedModel) o;
map.put(nodeRedModel.getType(), nodeRedModel);
}
}
}
}反射獲取接口的所有實(shí)現(xiàn)類
添加依賴
implementation 'org.reflections:reflections:0.9.12'
接口
package com.example.myapplication.people;
public interface IPeople {
? String say();
}實(shí)現(xiàn)類
package com.example.myapplication.people;
public class Student implements IPeople{
? @Override
? public String say() {
? ? return "I am a student";
? }
}package com.example.myapplication.people;
public class Teacher implements IPeople{
? @Override
? public String say() {
? ? return "I am a teacher";
? }
}工具類
package com.example.myapplication;
import android.net.IpPrefix;
import com.example.myapplication.people.IPeople;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.reflections.Reflections;
public class Utils {
? public static Map<String,Class> getAllIPeopleImpl(){
? ? Reflections reflection=new Reflections("com.example.myapplication.people");
? ? Map<String,Class> map=new HashMap<>();
? ? Set<Class<? extends IPeople>> set=reflection.getSubTypesOf(IPeople.class);
? ? for(Class c:set){
? ? ? map.put(c.getSimpleName(),c);
? ? }
? ? return map;
? }
}測試類
package com.example.myapplication;
import com.example.myapplication.people.IPeople;
import java.util.Map;
import org.junit.Test;
import static org.junit.Assert.*;
/**
?* Example local unit test, which will execute on the development machine (host).
?*
?* @see <a rel="external nofollow" >Testing documentation</a>
?*/
public class ExampleUnitTest {
??
? @Test
? public void test() {
? ? Map<String, Class> map = Utils.getAllIPeopleImpl();
? ? try {
? ? ? for (String str : map.keySet()) {
? ? ? ? Object people = map.get(str).newInstance();
? ? ? ? if(people instanceof IPeople){
? ? ? ? ? System.out.println(str);
? ? ? ? ? System.out.println(((IPeople) people).say());
? ? ? ? }
? ? ? }
? ? } catch (IllegalAccessException | InstantiationException e) {
? ? ? e.printStackTrace();
? ? }
? }
}總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java并發(fā)編程學(xué)習(xí)之Unsafe類與LockSupport類源碼詳析
這篇文章主要給大家介紹了關(guān)于Java并發(fā)編程學(xué)習(xí)之Unsafe類與LockSupport類源碼的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧2018-06-06
使用SpringBoot+OkHttp+fastjson實(shí)現(xiàn)Github的OAuth第三方登錄
這篇文章主要介紹了使用SpringBoot+OkHttp+fastjson實(shí)現(xiàn)Github的OAuth第三方登錄,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
SpringBoot項(xiàng)目中使用Jsp的正確方法
SpringBoot默認(rèn)是不支持JSP開發(fā)的,若是需要使用JSP的話便需要自己配置外部的tomcat,下面這篇文章主要給大家介紹了關(guān)于SpringBoot項(xiàng)目中使用Jsp的正確方法,需要的朋友可以參考下2023-05-05
java字節(jié)碼框架ASM操作字節(jié)碼的方法淺析
這篇文章主要給大家介紹了關(guān)于java字節(jié)碼框架ASM如何操作字節(jié)碼的相關(guān)資料,文中通過示例代碼介紹的很詳細(xì),有需要的朋友可以參考借鑒,下面來一起看看吧。2017-01-01
jdbc實(shí)現(xiàn)圖書館借閱系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了jdbc實(shí)現(xiàn)圖書館借閱系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-02-02
SpringCloud?微服務(wù)數(shù)據(jù)權(quán)限控制的實(shí)現(xiàn)
這篇文章主要介紹的是權(quán)限控制的數(shù)據(jù)權(quán)限層面,意思是控制可訪問數(shù)據(jù)資源的數(shù)量,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2021-11-11
SpringBoot項(xiàng)目打包為JAR文件的實(shí)現(xiàn)
本文主要介紹了SpringBoot項(xiàng)目打包為JAR文件的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-09-09

