如何从Java程序动态创建新的.java文件?

时间:2011-01-22 07:35:40

标签: java reflection

我想从Java程序创建一个.java。当我运行程序时,将自动在我的项目中创建一个Java文件,并在该文件中创建一些运行时(动态)变量。我怎么能这样做?

我知道,我必须使用像ClassMethod这样的Reflection API,但ClassMethod中有哪些方法可以做到这一点?

4 个答案:

答案 0 :(得分:1)

您无法使用反射API创建新类或方法。它们不是为此而设计的。 (ClassMethod API用于以动态方式对对象实例执行操作。)

如果您想动态创建新代码,有两种基本方法可以实现:

  1. 生成Java源代码,将其写入文件,使用Java编译器将其编译为字节码文件,然后加载字节码。 (有一些标准API用于在正在运行的应用程序的JVM中运行Java编译器。)

  2. 使用BCEL或等效文件从头开始构造字节码文件,然后加载字节码。

  3. 这两种方法都很棘手并且计算成本很高。 BCEL方法特别棘手,因为您需要了解很多关于JVM才能完成这项工作。

答案 1 :(得分:1)

显然,您希望在运行时创建一个新类并使用它。您可以确保创建一个.java文件,编译它并从自定义类加载器加载它,但这可能不是最好/最简单的事情。以下是一系列解决方案:

  1. 首先,如果要扩展接口,可以使用Java Reflection API中的Proxy
  2. 您希望扩展一个类,而不是实现一个接口或创建一个您需要使用库来创建字节码的蓝色类。你可以在http://www.java-opensource.com/open-source/bytecode-libraries.html找到一堆。在这些库中我喜欢javassist,主要是因为它是我所知道的唯一一个让你直接输入Java代码而不是字节码的库。
  3. 最后一个解决方案应该是使用像Groovy或BSH这样的框架来解释伪java代码。

答案 2 :(得分:0)

不,您无法使用Reflection生成新的.java文件。您可以创建一个新类,并在运行时使用此类,但不能以.java源文件的形式将该类写入文件。

例如,看一下JustAdd框架。该框架解决了这类问题IIRC。

答案 3 :(得分:0)

Java是一种强类型语言(与弱类型语言相对)。简单地说,您需要有一个Class(原型)来创建一个对象实例。你想要做的事情在java(或任何强类型语言)中并不自然。

如果必须在java中使用此功能,则需要使用groovy。 Groovy是一种可以在Java JVM中运行的动态语言。你需要在groovy中检查Expandos。(当然它仍然不会创建.java文件)。