我从未尝试过动态生成/编译的类,但是...
尝试使用 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。