代码之家  ›  专栏  ›  技术社区  ›  Lehane

在Java应用程序运行时定义类

  •  17
  • Lehane  · 技术社区  · 15 年前

    在爪哇中,当应用程序运行时,是否可以创建类定义,然后创建该类的对象?

    例如,正在运行的应用程序将读取一个文本文件,该文件包含要包含在新类中的类成员列表。然后,应用程序将根据成员列表定义一个类定义,然后使其疯狂。

    11 回复  |  直到 15 年前
        1
  •  11
  •   MahdeTo Ben ODay    15 年前

    是的,理论上可以这样做,您的类文件是字节代码,在字节数组的末尾!然后,可以使用方法defineclass(string,byte[],int,int)获取一个类实例,该实例可用于通过反射实例化对象。

    在实践中,你可以使用 CGLib javaassist .

    您还可以使用在文件中生成Java代码的漫长方式,调用编译器,然后加载文件。

        2
  •  2
  •   Boune    15 年前

    您可以使用 ASM

        3
  •  1
  •   Eli Courtwright    15 年前

    您可以通过将新类的代码写入文件,然后调用该文件上的Java编译器,并使用类加载器将该类动态加载到运行的应用程序中来实现这一点。ApacheTomcat为其JSP页面执行此操作;它获取代码,对其进行一些更改,将其包装在类中间的一个try/catch块中,然后将该块写入文件系统,编译它,并使用类加载器获取和控告它来服务请求。

        4
  •  1
  •   kgiannakakis    15 年前

    当然可以。例如,请参见 article .

        5
  •  1
  •   Brian Agnew    15 年前

    也许 最简单的 解决方案(不需要额外的库)是使用 Java compiler API 这是用Java 6来实现的。您只需生成.java,编译,然后执行一个类。

        6
  •  0
  •   coobird    15 年前

    也许有点过分了, Apache BCEL (字节代码工程库)可用于创建 class 运行时文件。

    虽然我自己没有尝试过,但可以想象,可以创建一个类,加载它,并在运行时实例化它。

        7
  •  0
  •   Gustavo Muenz    15 年前

    是的,这是可能的。

    可以使用创建类 Javassist 在运行时,通过定义类的主体并让javassist编译新的类。

    Javassist有一个自定义编译器,它根据类的定义创建字节码。它有一些处理事情的特殊方法,但是使用这个库非常简单和直观。

    Javassist用于JBoss,我认为这是一个很好的参考:)

    同样可以通过 BCEL 不过,这要困难得多(但这样,您就可以更好地控制正在生成的内容)。

        8
  •  0
  •   Evan    15 年前

    如果必须的话,您可以使用JRuby、JPython或groovy来做类似的事情。

    如果你感觉特别受虐,你可以看看 BCEL .

        9
  •  0
  •   Stefan Kendall    15 年前

    如果需要Java和元编程,请使用 Groovy .

        10
  •  0
  •   Esko Luontola    15 年前

    ASM 我想是Java的最低级别字节码库。这使得它非常困难,但也非常强大。我建议阅读ASM的文档( PDF 要真正理解Java中字节码生成是如何工作的。该文档还解释了如何在类加载器中加载字节码(正确操作的另一个困难主题)。

    在那之后,你可以使用一个更高级别的库,如果它能让你的生活更容易,并理解它们的作用。在许多情况下,例如生成代理服务器, CGLIB 有用且简单易用。为了获得更大的权力,许多人提到 Javassist (我没有用过它-cglib和asm对我很好)。

        11
  •  0
  •   Community CDub    7 年前

    最近有一个关于 in-memory compilation 在您成功地生成源代码之后,它应该给您一些关于应该做什么的提示。

    推荐文章