【问题标题】:Custom properties file and create class depends on properties [duplicate]自定义属性文件和创建类取决于属性[重复]
【发布时间】:2015-08-05 13:49:25
【问题描述】:

我想创建接口,以及实现这个接口的 x 个类。当程序运行时,我想创建一个新对象,它是此类的实例之一,该类在 .properties 文件中设置。甚至可能吗?

比如我有接口

  public interface A{
      void a();
  }

  class B1 implements A{
      void a(){}
  }

  class B2 implements A{
      void a(){}
  }

  A m = ?

而且我不知道是否可以从以某种方式在属性中定义的类创建对象?

【问题讨论】:

  • “是”。你有更具体的问题吗?您看过或尝试过什么,什么有效或无效?
  • 那个问题只讨论了反射作为一个选项,这不是解决这个问题的唯一可能选项。

标签: java


【解决方案1】:

您可以使用工厂方法模式的属性文件中的 if 或 switch 块。

或者你可以使用反射:

Class.forName, getConstructor and newInstance calls.

这是一个工厂的例子:

public class Factory {

    public static A getA(String propertyValue) {

        switch(propertyValue) {

        case "B1": return new B1(); 
        case "B2": return new B2();
        default: throw new RuntimeException("unsupported class");

        }

    }
}

如果 B1 和 B2 的实例可以安全地在线程之间共享,您也可以缓存它们,并始终返回这些缓存的实例。

如果您是提供接口 A 实现的人,我肯定会选择 Factory 选项。

仅当您无法以任何其他方式解决问题时才使用反射。在您的情况下,为其他将提供自己的 A 实现的人制作框架,该实现将从属性文件中选择。由于您不会事先知道这些类的名称,因此您必须使用反射。

【讨论】:

    【解决方案2】:

    是的,你可以,这很平常。

    读取“className”等字符串中的属性并使用以下语句:

    A a = (A)Class.forName(className).newInstance();
    

    请参阅此链接作为参考:Is there a way to instantiate a class by name in Java?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 2016-05-28
      • 1970-01-01
      • 2017-02-21
      相关资源
      最近更新 更多