1

我有一个关于实例化 Java 对象的特定方式的问题。

基本上,我需要实现一个实现接口的单例。我目前尝试使用工厂和一些反射来做到这一点,试图重现这个例子(准确地说是第 5 篇文章)。

我喜欢的部分是通过这种方法,我可以很容易地改变 Singleton 的实现。

问题是我真的不明白如何检索类名。在上面的示例中,这System.getProperty()似乎是一种方法,但该示例并未准确显示执行此操作所需的所有类型(未键入该字段)。问题是我不知道给该getProperty()方法哪个键。似乎它必须是带有.type(即mySingleton.name)的单例私有静态字段的名称,但它似乎不起作用......

我想知道如何检索类名。

顺便说一句,如果有更好的方法可以做到这一点,我愿意接受建议。

4

3 回答 3

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()需要类的完全限定名称 - 带有包声明

于 2012-08-13T09:45:44.740 回答
1

typeName 是 String 。所以你需要的是完全限定的类名来像你一样用反射加载类

类类型 = Class.forName(typeName);

System.getProperty() 是一种访问您在执行程序时拥有的系统属性/环境属性的方法。要通过示例为您缩小范围,您可以设置系统变量,如下所示: 如果在 Windows 中:

cmd> 设置 a.type = mytest.testclass

如果在 linux 中:

$ export a.type = mytest.testclass

使您尝试加载的类位于类路径中。

在运行程序之前,您需要执行上述步骤。

谈到最佳实践,上述方法可用于测试程序,但在进入实时解决方案时,您可能会有一些方法从文件或数据库中读取这些类名。可能是某种配置参数。

于 2012-08-13T09:57:53.680 回答
0

您可以根据需要制作任何属性。你可以得到属性,System.getProperty("my.property")你可以把它变成一个类Class.forName()

也许你可以说什么对你不起作用,因为它很简单,我认为你做的几乎是正确的。

于 2012-08-13T09:48:13.287 回答