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

时间:2015-05-23 16:58:50

标签: java

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

例如我有界面

  public interface A{
      void a();
  }

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

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

  A m = ?

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

2 个答案:

答案 0 :(得分:0)

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

或者你可以使用反射:

Class.forName, getConstructor and newInstance calls.

以下是Factory的一个例子:

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实现,这些实现将从属性文件中选择。既然您不会事先知道这些课程的名称,那么您必须使用反思。

答案 1 :(得分:0)

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

在类似" className"的字符串中读取属性。并使用以下声明:

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

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