当前位置: 首页 > 知识库问答 >
问题:

Java接口实现-自动初始化器

谭山
2023-03-14

我想知道是否有可能使特定接口的任何实现在接口本身初始化时自动执行特定操作。像下面这样:

public interface MyInterface {

    public static final ArrayList<MyInterface> IMPLEMENTATIONS = new ArrayList<>();

    public static void init(){
        // Somecode...
    }

    void method1();

    void method2();

}

我希望在初始化接口时,比如调用init方法,然后创建实现接口的每个类的新实例,并将其添加到ArrayList中。

这样做的目的是基本上有一个单一的程序,可以启动我编写的任何其他程序。基本上,它是在计算机启动时启动的,然后可以用来启动我编写的任何其他程序,而不必将每个新程序添加到系统自动启动文件夹中。

这样可能吗?

共有3个答案

余弘毅
2023-03-14

你的问题太笼统,无法给出具体的答案。然而,(如果我理解正确的话)我编写了一个开源库MgntUtils,它包含一个小框架,具有一个称为自填充工厂的特性。简而言之,它是如何工作的:您可以扩展框架提供的工厂,并编写自己的接口来扩展框架提供的接口。然后编写几个实现接口的类,一旦调用了类的构造函数,每个类都会将自身插入工厂,因此,一旦程序启动(例如Spring Boot或Spring框架)启动类,工厂就完全初始化并准备好使用。无论如何,这里有相关的图书馆链接和文章来解释这个想法和用途:

详细解释这个想法的文章
关于MgntUtils库的文章
javadoc中的包描述,详细解释了如何使用功能
完整的Javadoc
Github与库,包括源代码和javadoc
Maven Central与库的所有版本

焦阎宝
2023-03-14

除了Manish的答案,如果您已经从类继承;您可以使用外部方法,该方法将通过多态初始化从您的接口继承的实例

它将围绕这些线提供一些信息:

public class MyInterfaceFactory {
    public static void initializeElements( MyInterface _element ) {
        MyInterface.IMPLEMENTATIONS.add( _element );
    }
}

或者,您可以在每个实现类的构造函数中对数组进行添加。

边银龙
2023-03-14

不要使用Interface,而是使用抽象类。此外,在该类中,创建一个接受抽象类作为参数的单个参数构造函数。然后在构造函数中,您可以将该参数添加到ArrayList中。

然后,在主类中,您可以使用org。反射以创建扩展抽象类的所有类的实例。然后调用init方法,在该方法中可以对列表执行操作。

public class MyClass{
  private static final List<MyClass> IMPLEMENTATIONS = new ArrayList<>();
  public MyClass(MyClass myClass){
    IMPLEMENTATIONS.add(myClass);
  }
  public static void init(){
    // Do something with IMPLEMENTATIONS
  }
  abstract void method1();

  abstract void method2();

}

package com.mypackage; 
public class Child extends MyClass{
  public Child(){
    super(this);
  }
  // Implement other abstract methods
}

public class MyMainClass{
  public static void main(String[] args) throws IllegalAccessException, InstantiationException { 
    Reflections reflections = new Reflections("com.mypackage"); 
    Set<Class<? extends MyClass>> classes = reflections.getSubTypesOf(MyClass.class); 
    for (Class<? extends MyClass> aClass : classes){ 
      aClass.newInstance(); 
      }
    MyClass.init();
    }
}

 类似资料:
  • 问题内容: 在当前的问题中(我将文件打印到Java中的物理打印机),我一直在疯狂地遍历代码,试图从所使用的每个类的javadoc中吞噬所有有用的丢失信息。 现在,我从以前的问题中抽出了很多代码,所以有相当一部分我不是自己写的。我注意到的问题是,我抓取的代码正在初始化一个对象,例如实现接口(Doc)的“SimpleDoc”并将其分配给该接口? 小代码段: 现在,据我所知,我们创建了对象。我熟悉继承,

  • 说明 用于初始化接口类型、协议,验证接口密钥 请求地址 http://api.dc78.cn/Api/sys_init 请求方式 GET 请求参数 参数 参数名称 必填 描述 范例 protocal 接口协议类型 否 用于声明接口使用的协议类型 mqtt type 客户端接口 否 用于说明客户端接口的类型 api 接口协议目前支持两种:mqtt、http。设置相应类型后,平台端将以此协议与客户端进

  • 本文向大家介绍Python接口自动化测试的实现,包括了Python接口自动化测试的实现的使用技巧和注意事项,需要的朋友参考一下 1)环境准备:   接口测试的方式有很多,比如可以用工具(jmeter,postman)之类,也可以自己写代码进行接口测试,工具的使用相对来说都比较简单,重点是要搞清楚项目接口的协议是什么,然后有针对性的进行选择,甚至当工具不太适合项目时需要自己进行开发。   在我们项目

  • 我正在经历对我来说毫无意义的奇怪行为。以下程序(我试图将其简化为最小的示例)因而崩溃,因为为: 我希望它打印: 但是如果(可以通过取消对main方法的第一行的注释或对以下两行重新排序来完成),程序将正确终止。 我怀疑这个问题与Java类初始化顺序有关,但我在相关JLS部分中找不到任何解释。 所以,我的问题是:这到底是怎么回事?这是某种虫子还是我错过了什么? 我的JDK版本是1.8.0_111

  • 本文向大家介绍python+requests接口自动化框架的实现,包括了python+requests接口自动化框架的实现的使用技巧和注意事项,需要的朋友参考一下 为什么要做接口自动化框架 1、业务与配置的分离 2、数据与程序的分离;数据的变更不影响程序 3、有日志功能,实现无人值守 4、自动发送测试报告 5、不懂编程的测试人员也可以进行测试 正常接口测试的流程是什么? 确定接口测试使用的工具--

  • 我有一个关于比较器接口的问题。在我的类下面实现了按长度而不是按字符值排序的默认排序的接口。 覆盖默认比较后,我使用对我的字符串数组进行排序。即使我覆盖了默认方法,如果我使用Arrays.sort,它会调用默认比较而不是我覆盖的方法。这是因为我显式调用了超类方法吗? 另一个问题是初始化接口本身。我知道您不能初始化接口,而是初始化一个类对象(实现所述接口)来引用接口可用的方法。在这种情况下,当我初始化