我对实例化Java对象的具体方法有疑问。
基本上,我需要实现一个实现接口的Singleton。我目前尝试使用工厂和一些反思来做到这一点,试图重现this example(第5篇,正是)。
我喜欢的部分是通过这种方法,我可以很容易地改变Singleton的实现。
问题是我真的不懂如何检索类名。在上面的示例中,System.getProperty()
似乎是一种执行此操作的方法,但该示例并未准确显示执行此操作所需的所有类型(该字段未键入)。问题是我不知道给getProperty()
方法的哪个键。它似乎必须是带有.type(即mySingleton.name
)的单例私有静态字段的名称,但它似乎不起作用......
我想知道如何检索班级名称。
顺便说一句,如果有更好的方法,我愿意接受建议。
答案 0 :(得分:1)
如果您在“
中询问String typeName = System.getProperty("a.type");
private synchronized static final void createA()
{
// This is just one possibility for getting the class name.
String typeName = System.getProperty("a.type");
Class type = Class.forName(typeName);
a = type.newInstance();
}
a.type
来自哪里? - 它只是系统属性,仅在您的操作系统中为此目的声明。
Class c = Class.forName("java.lang.String");
如上所示 - Class.forName()
需要完全限定的类名 - 包声明
答案 1 :(得分:1)
typeName是String。所以你需要的是完全合格的类名,用像你这样的反射加载类
类类型= Class.forName(typeName);
System.getProperty()是一种访问执行程序时所具有的系统属性/环境属性的方法。 要通过示例缩小范围,您可以设置系统变量,如下所示: 如果在Windows中:
CMD>设置a.type = mytest.testclass
如果在linux中:
$ export a.type = mytest.testclass
使您尝试加载的类在classpath中。
在运行程序之前需要执行的上述步骤。
采用最佳实践,上述方法可用于测试程序,但在进入实时解决方案时,您可能会有一些方法从文件或数据库中读取这些类名。可能是某种配置参数。
答案 2 :(得分:0)
您可以随意制作任何物业。您可以使用System.getProperty("my.property")
获取属性,然后将其转换为Class.forName()
也许你可以说什么对你不起作用,因为它非常简单,我认为你做的几乎是正确的。