【发布时间】:2014-07-02 07:45:47
【问题描述】:
我实现了本教程 http://www.javablogging.com/dynamic-in-memory-compilation/comment-page-1/#comment-65105 中的代码,它在一个坚果壳中动态创建一个类并仅将其保存到内存中(而不是写入扩展名为 .java 的文件并编译该文件带有扩展名.class)。在他的main 末尾,他用
Object instance = fileManager.getClassLoader(null)
.loadClass(fullName).newInstance();
System.out.println(instance);
在我们创建的文件中,我们定义了toString 方法,所以当我们打印出instance 时,会打印出类名。但是当我向类中添加方法并尝试调用它们时,我收到错误 method is undefined for type object。
我知道在正常情况下,我需要像 Object obj = new Foo(); 一样使用 Object,然后我可以调用 Foo 的成员,但是使用上面显示的代码,我无法将 new 粘贴在 fileManager...newInstance(); 前面
结论:
如何根据教程创建 DynaClass(动态创建的类)的实例并调用其成员。
更新:
我不确定是否可以转换对象,因为我们正在动态创建类并且所有内容都在字符串中。据我所知,您不能使用字符串名称进行转换。
【问题讨论】:
-
简单 - 投射它(如果可以的话)。
-
@duffymo 如果类型还不存在,你会将它转换成什么? (还是我误解了这里的目的?)
-
该类型存在于内存中,但我们没有将其转换为的名称,因为该名称在字符串中。
-
你试过
Foo foo = (Foo)instance;吗?如果您在运行时从源代码创建类,请尝试 Javassist 或 Janino 库。 -
没有
Foo可以投射。我可以查看这些库,但我需要避免使用库并使用纯 Java。