通过反射实例化Java对象

通过反射实例化Java对象,java,reflection,Java,Reflection,我有一个关于实例化Java对象的特定方式的问题 基本上,我需要实现一个实现接口的单例。我目前尝试使用一个工厂和一点反射来实现这一点,试图复制(第5篇文章,准确地说) 我喜欢的部分是,通过这种方法,我可以很容易地更改Singleton的实现 问题是我真的不明白如何检索类名。在上面的示例中,System.getProperty()似乎是实现这一点的一种方法,但该示例并没有精确显示实现这一点所需的所有类型(该字段未键入)。问题是我不知道给getProperty()方法指定哪个键。似乎它必须是带有.ty

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

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

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

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

我想知道如何检索类名


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

如果您询问的是
String typeName=System.getProperty(“a.type”)输入“

a.type
来自哪里?-它只是系统属性,在操作系统中声明仅用于此目的

Class c = Class.forName("java.lang.String");

如上所示-
Class.forName()
需要类的完全限定名-通过包声明

您可以随意创建属性。您可以使用
System.getProperty(“my.property”)
获取属性,您可以使用
Class.forName()
将其转换为一个类


也许你可以说什么不适合你,因为它非常简单,我认为你做的几乎是对的。

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

Class type=Class.forName(typeName)

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

cmd>set a.type=mytest.testclass

如果在linux中:

$export a.type=mytest.testclass

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

运行程序前需要执行的上述步骤


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

这正是我想知道的。我不知道它来自何处,是否由Java f生成或属性中的每个对象,或通过手动设置此属性来定义。默认设置,将Windows/Linux/任何内容视为属性文件。@user1594913如果它不是内置属性,则将其设置为您设置的任何内容,例如,在命令行上使用
-Dproperty=value
。似乎找不到该属性。我认为它是一个新生成的属性ed属性(例如,对于每个类,定义了一组属性),而事实上它不是,然后它找不到它。我可能必须手动定义我要实例化的类的名称,然后…JVM无法知道要定义哪个属性或将其设置为哪个类名。您可以做的是提供一个默认值,例如
System.getProperty(“my.property”,“my.package.class”)
所以不管是否设置了类,您都会得到一个类。我建议您在走这条路太远之前,先仔细看看
java.util.ServiceLoader
Class c = Class.forName("java.lang.String");