如何使用变量名运行.java文件

时间:2015-06-19 17:26:43

标签: java class

我试图根据Pebble智能手表操作系统制作程序。我有一个名为PebbleOS_Faces.txt的文本文件,其中包含我将在手表上看到的不同表盘的所有名称。

我使用PrintWriter将内容转换为 .java 文件,然后使用我从this post获得的代码编译它。它被编译到 build / classes / pebbleos 文件夹中(我使用Netbeans for Mac,如果有所作为),在所有其他类旁边。我已经确认这一切都正常。

剩下的是我从程序内部实际运行课程。问题是,根据PebbleOS_Faces.txt文件中表盘的名称,每个类的名称都不同。如何创建具有变量名称的类的实例?

2 个答案:

答案 0 :(得分:0)

您需要使用反射。您可以使用Class按名称获取Class.forName(String)个对象。您可以使用Class.getConstructors()[0].newInstance(<insert constructor arguments here>) *调用构造函数。确保所有类都继承了一个公共超类,以便您可以执行以下操作:

WatchFace face = Class.forName(watchFaceName).getConstructors()[0].newInstance();

*假设只有一个构造函数

答案 1 :(得分:0)

我从未尝试使用动态生成/编译的类,但是......

尝试使用Class.forName(“com.example.YourClassName”)来获取对类的引用:

http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#forName(java.lang.String)

然后使用Class.newInstance()创建类的实例:

http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#newInstance()

为此,com.example.YourClassName必须对您的类加载器可见。

例如:

Class clazz = Class.forName("com.example.YourClassName");
Object instance = clazz.newInstance();

newInstance()调用仅在您的类具有无参数构造函数时才有效。

如果YourClassName类的构造函数需要参数,则必须使用稍微不同的技术来调用特定的构造函数并将值传递给它。例如,如果您有这样的构造函数:

YourClassName(Integer someInt,String someString)

然后你可以通过该构造函数实例化YourClassName:

Class clazz = Class.forName("com.example.YourClassName");
Constructor constructor = clazz.getConstructor(Integer.class, String.class);
Object instance = constructor.newInstance(anInteger, "aString");

如果YourClassName的每个实例都实现相同的interface或扩展相同的基类,那么您可以将newInstance()的返回值强制转换为该接口或基类。然后,您就可以在实例上调用接口或基类的方法。否则,在Object上调用有用方法的唯一方法是use reflection