我想创建接口,以及实现此接口的x类。当程序运行时,我想创建新对象,该对象是这个类的实例之一,该类在.properties文件中设置。它甚至可能吗?
例如我有界面
public interface A{
void a();
}
class B1 implements A{
void a(){}
}
class B2 implements A{
void a(){}
}
A m = ?
而且我不知道是否可以从类中创建以某种方式在属性中定义的对象?
答案 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?