Java如何获取接口所有的实现类

目录
  • Java获取接口所有的实现类
  • 反射获取接口的所有实现类
  • 总结

Java获取接口所有的实现类

最近因业务需求,要实现NodeRed服务后端化,为使各个节点的解析进行插件化(NodeRed各个节点也是插件化,安装插件即可使用) ,后端不得不动态加载解析NodeRed节点json,用一个接口来统一管理。

import cn.hutool.core.util.ClassUtil;
import java.util.*;

/**
 * 此类用来解析NodeRed服务器的json串
 */
public class NodeRedParseUtil {

    public static void main(String[] args) throws IllegalAccessException, InstantiationException {
        //获取所有的模型实现类
        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);
            }
        }
    }

}

反射获取接口的所有实现类

添加依赖

implementation 'org.reflections:reflections:0.9.12'

接口

package com.example.myapplication.people;

public interface IPeople {
  String say();
}

实现类

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 href="http://d.android.com/tools/testing" 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();
    }
  }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java中的List接口实现类解析

    目录 Java的List接口实现类 实现类ArrayList 实现类LinkedList 实现类Vector List三个实现类 Java的List接口实现类 实现类ArrayList ArrayList类相当于一个容量可变的动态数组,当超过了他的大小时,类集自动增加,当对象被删除后,数组就可以缩小. import java.util.*; public class ListDemo { public static void main(String args[]){ Collection c1

  • java集合collection接口与子接口及实现类

    目录 概要 1 Collection接口的实现子类特性 2 通过实现子类ArrayList体现Collection接口方法 2.1 代码演示示例 3 集合的遍历:①使用Iterator(迭代器)②增强for循环遍历 3.1 代码示例 4 List相关解读 5 Set接口分析 Map接口及实现子类 结语 概要 集合概念:像数组一样是java的一个容器:和数组不同的是数组只能存同类型的数据,且长度定义之后就不可变,集合不仅,可以存多种类型的数据,而且还提供了增.删.改.查的方法: 集合分类:可以分为

  • Java Set接口及常用实现类总结

    目录 前言 概述 Set 无序性与不可重复性的理解 无序性 不可重复性 Set 接口常用实现类 HashSet LinkedHashSet TreeSet 前言 Collection的另一个子接口就是Set,他并没有我们List常用,并且自身也没有一些额外的方法,全是继承自Collection中的,因此我们还是简单总结一下,包括他的常用实现类HashSet.LinkedHashSet.TreeSet的总结! 概述 Set 接口是 Collection 的子接口, set 接口没有提供额外的方法.

  • Java SpringBoot 获取接口实现类汇总

    目录 前言 一.获取接口的所有实现类 1.枚举 2.业务接口 2.1 实现类 3.ApplicationContextAware接口实现类 4.获取到所有实现类使用 前言 有时候,根据业务逻辑的需求,需要获取到某个接口的所有实现类,然后根据业务类型来执行不同的实现类方法.有点类似策略模式. 如果没有用到 Spring的话,可以使用 ServiceLoaderl类JDK自带的一个类加载器(其他框架的SPI机制也是可以实现). ServiceLoader<MyInterface> loader =

  • java中List接口与实现类介绍

    目录 List接口介绍-ArrayList ArrayList源码结论 ArrayList源码分析 总结 List接口介绍-ArrayList 有序.可重复 线程不安全,因为没有synchronized修饰 ArrayList源码结论 ArrayList中维护了一个Object类型的数组elementData. transient Object[] elementData; // transient 表示该属性不会被序列化 当创建ArrayList对象时,如果使用的是无参构造器,则初始eleme

  • Java集合之Map接口与实现类详解

    目录 初识Map Map中常用方法 HashMap LinkedHashMap TreeMap HashMap和TreeMap的比较 Hashtable 集合中元素的遍历 iterator接口中的方法 Enumeration接口中的方法 初识Map Map接口没有从Collection接口继承,Map接口用于维护“键-值”对数据,这个“键-值”对就是Map中的元素,Map提供“键(Key)”到“值(value)”的映射,一个Map中键值必须是唯一的,不能有重复的键,因为Map中的“键-值”对元素

  • 使用spring动态获取接口的不同实现类

    目录 spring动态获取接口的不同实现类 当时想到了两种解决办法 获取某接口所有实现类 正文 结果 spring动态获取接口的不同实现类 最近做项目,有个需求是和外部对接,从接口获取新闻数据,把数据和缓存中的数据对比,多了的添加到数据库,少了的删掉. 接口有两个,一开始我是在业务类里写了两个方法,代码太长,简单说就是两个部分: public Object saveANews() { //1.获取A接口新闻列表 //2.和缓存对比,存数据到数据库 } public Object saveBNew

  • springboot如何获取接口下所有实现类

    目录 springboot获取接口下所有实现类 springboot动态调用实现类 1.添加接口 2.创建实现类 3.获取实现类的相关接口 springboot获取接口下所有实现类 首先定义一个接口 public interface LoginUserService { /** * 判断手机号是否允许登录 * * @param phone 手机号 * @return 是否允许 */ boolean hasUser(String phone) throws ServiceException; /*

  • Java获取接口所有实现类的方式详解

    有时候,根据业务逻辑的需求,我们想要获取到某个接口的所有实现类.在这里大致介绍两种方式: 1.借助Spring容器实现 Spring作为一个容器,管理着一个项目中所有经过配置的Java类(xml配置文件或Annotation方式).如果某个接口的所有实现类均被Spring托管了,那么通过Spring就可以很简单的返回这些实现类. import org.springframework.beans.BeansException; import org.springframework.context.

  • Java NIO Path接口和Files类配合操作文件的实例

    Path接口 1.Path表示的是一个目录名序列,其后还可以跟着一个文件名,路径中第一个部件是根部件时就是绝对路径,例如 / 或 C:\ ,而允许访问的根部件取决于文件系统: 2.以根部件开始的路径是绝对路径,否则就是相对路径: 3.静态的Paths.get方法接受一个或多个字符串,字符串之间自动使用默认文件系统的路径分隔符连接起来(Unix是 /,Windows是 \ ),这就解决了跨平台的问题,接着解析连接起来的结果,如果不是合法路径就抛出InvalidPathException异常,否则就

  • Java中获取类路径classpath的简单方法(推荐)

    如下所示: <SPAN style="FONT-SIZE: 18px"> System.out.println("++++++++++++++++++++++++"); String path = System.getProperty("java.class.path"); String path2 = FreeMarkerWriter.class.getProtectionDomain().getCodeSource().getLo

  • 浅谈java的接口和C++虚类的相同和不同之处

    C++虚类相当于java中的抽象类,与接口的不同之处是: 1.一个子类只能继承一个抽象类(虚类),但能实现多个接口 2.一个抽象类可以有构造方法,接口没有构造方法 3.一个抽象类中的方法不一定是抽象方法,即其中的方法可以有实现(有方法体),接口中的方法都是抽象方法,不能有方法体,只有声明 4.一个抽象类可以是public.private.protected.default,接口只有public 5.一个抽象类中的方法可以是public.private.protected.default,接口中的

  • Java 汉字获取拼音或首字母工具类代码分析

    本文主要介绍Java中,将字符串中的中文转化为拼音,获取汉字串拼音首字母,获取汉字串拼音的工具类,以及相关的示例代码. 1.Maven依赖配置(pom.xml) <dependency> <groupId>com.belerweb</groupId> <artifactId>pinyin4j</artifactId> <version>2.5.1</version> </dependency> 2.工具类代码

随机推荐