Java 自定义属性文件和创建类取决于属性

Java 自定义属性文件和创建类取决于属性,java,Java,我想创建一个接口,以及实现这个接口的x类。当程序运行时,我想创建一个新的对象,它是这个类的一个实例,这个类在.properties文件中设置。有可能吗 例如,我有一个接口 public interface A{ void a(); } class B1 implements A{ void a(){} } class B2 implements A{ void a(){} } A m = ? 我不知道是否可以从属性中定义的类

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

例如,我有一个接口

  public interface A{
      void a();
  }

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

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

  A m = ?

我不知道是否可以从属性中定义的类中创建对象?

您可以使用if或使用工厂方法模式切换属性文件中的block-on值

或者您可以使用反射:

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选项


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

是的,您可以,这是非常常见的

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

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

请参阅此链接作为参考:

“是”。你有更具体的问题吗?你看了什么或尝试了什么,做了什么或没有做什么?这个问题只讨论了作为一种选择的反射,这不是解决这个问题的唯一可能的选择。