通过反射实例化Java对象

时间:2012-08-13 09:40:34

标签: java reflection

我对实例化Java对象的具体方法有疑问。

基本上,我需要实现一个实现接口的Singleton。我目前尝试使用工厂和一些反思来做到这一点,试图重现this example(第5篇,正是)。

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

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

我想知道如何检索班级名称。

顺便说一句,如果有更好的方法,我愿意接受建议。

3 个答案:

答案 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()

的类

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