Java如何獲取接口所有的實現(xiàn)類
Java獲取接口所有的實現(xiàn)類
最近因業(yè)務(wù)需求,要實現(xiàn)NodeRed服務(wù)后端化,為使各個節(jié)點的解析進行插件化(NodeRed各個節(jié)點也是插件化,安裝插件即可使用) ,后端不得不動態(tài)加載解析NodeRed節(jié)點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 {
//獲取所有的模型實現(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) {
//實例化
Object o = aClass.newInstance();
System.out.println();
if (o instanceof NodeRedModel) {
NodeRedModel nodeRedModel = (NodeRedModel) o;
map.put(nodeRedModel.getType(), nodeRedModel);
}
}
}
}反射獲取接口的所有實現(xiàn)類
添加依賴
implementation 'org.reflections:reflections:0.9.12'
接口
package com.example.myapplication.people;
public interface IPeople {
? String say();
}實現(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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java并發(fā)編程學習之Unsafe類與LockSupport類源碼詳析
這篇文章主要給大家介紹了關(guān)于Java并發(fā)編程學習之Unsafe類與LockSupport類源碼的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧2018-06-06
使用SpringBoot+OkHttp+fastjson實現(xiàn)Github的OAuth第三方登錄
這篇文章主要介紹了使用SpringBoot+OkHttp+fastjson實現(xiàn)Github的OAuth第三方登錄,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-02-02
java字節(jié)碼框架ASM操作字節(jié)碼的方法淺析
這篇文章主要給大家介紹了關(guān)于java字節(jié)碼框架ASM如何操作字節(jié)碼的相關(guān)資料,文中通過示例代碼介紹的很詳細,有需要的朋友可以參考借鑒,下面來一起看看吧。2017-01-01
SpringCloud?微服務(wù)數(shù)據(jù)權(quán)限控制的實現(xiàn)
這篇文章主要介紹的是權(quán)限控制的數(shù)據(jù)權(quán)限層面,意思是控制可訪問數(shù)據(jù)資源的數(shù)量,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2021-11-11

