【发布时间】:2019-12-02 16:15:23
【问题描述】:
我已经创建了一个空类SimpleClass。如何在运行时在此类中生成一些代码并重新编译该类以使用该代码?
public class SimpleClass {}
我找到了使用自定义 ClassLoader 和 javax.tools API 生成整个类及其内容的解决方案。
但是现有的课程有吗?
public class SimpleClass {
//Generated code in runtime
public void method() {
System.out.println("Generated method");
}
}
【问题讨论】:
-
你为什么需要这个?根据上下文,其他解决方案可能会起作用,例如您无法在运行时向加载的类添加方法。您可以在编译时执行此操作。您可以在运行时加载类之前执行此操作。您也可以使用该方法生成新类,或扩展此类的新类。很多可能性,也许你甚至不需要生成一个方法,也许是 xyproblem.info 请描述你为什么需要这个。
-
使用字节码检测 API(如 ASM、Javaassit、ByteBuddy 等),您可以添加/删除方法、文件、方法体等。
-
@GotoFinal,我有一个包含一百多个字段的类,我需要调用具体的方法。方法具有相同的主体但使用不同的字段,例如:
public class SimpleClass { private String f1; private String f2; private String f3; public void useF1() { // do some action with f1 } public void useF2() { // do some action with f2 } public void useF3() { // do some action with f3 } } -
@GotoFinal,我希望这个类只有一个生成的方法,每次我想用具体参数调用它时都会重新编译,比如:
public void useF(String fieldName) { // do some action with field with name - fieldName } -
为什么你有这样的代码,你不能用地图来做这个吗?这听起来不是个好主意。也许只是用你正在尝试做的真实事情来编辑你的问题,而不是如何。
标签: java reflection runtime classloader code-generation