我试图根据Pebble智能手表操作系统制作程序。我有一个名为PebbleOS_Faces.txt
的文本文件,其中包含我将在手表上看到的不同表盘的所有名称。
我使用PrintWriter
将内容转换为 .java 文件,然后使用我从this post获得的代码编译它。它被编译到 build / classes / pebbleos 文件夹中(我使用Netbeans for Mac,如果有所作为),在所有其他类旁边。我已经确认这一切都正常。
剩下的是我从程序内部实际运行课程。问题是,根据PebbleOS_Faces.txt
文件中表盘的名称,每个类的名称都不同。如何创建具有变量名称的类的实例?
答案 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。