在运行时动态构建java/scala方法体并执行它

在运行时动态构建java/scala方法体并执行它,java,scala,reflection,Java,Scala,Reflection,假设我有以下java接口: public interface DynamicMethod { String doit(); } 我想在运行时构建一个符合上述接口的对象,以便在其中注入doit方法体,然后执行它?使用Java反射API或任何其他方式都可以做到这一点吗?或者可能在Scala的某些方面 请注意,我的对象的doitbody是动态的,并且不是先验的。您可以假设在运行时提供了一个字符串数组CodeArray[1..10],该数组的每个条目都包含每个doit方法的代码。如果您能给出一

假设我有以下java接口:

public interface DynamicMethod {
    String doit();
}
我想在运行时构建一个符合上述接口的对象,以便在其中注入doit方法体,然后执行它?使用Java反射API或任何其他方式都可以做到这一点吗?或者可能在Scala的某些方面

请注意,我的对象的
doit
body是动态的,并且不是先验的。您可以假设在运行时提供了一个字符串数组
CodeArray[1..10]
,该数组的每个条目都包含每个doit方法的代码。如果您能给出一个示例代码,我将不胜感激


上下文: 我试图解释问题的背景;尽管如此,上述问题仍然与上下文无关

我有一些命令,比如C1,C2。。。;每个命令都有特定的参数。根据命令及其参数,系统需要执行特定任务(可使用java代码表达)。我需要存储这些命令,以便根据用户需求在将来执行(因此,上面的
coderaray[1..10]
中包含此java代码列表)。例如,用户从列表(即,从数组)中选择命令并要求执行


我的想法是,我构建了一个基于用户选择的引擎,从数组中加载相应的命令代码并执行它

目前还不清楚你的目标是什么。根据您的需求,有许多方法可以做到这一点


在某些情况下,创建和就足够了。有时,生成Java源代码,然后在运行时调用并使用加载生成的类是合理的(如果您谈论的是代码字符串,可能就是这种情况)。有时,最好使用库直接创建字节码,例如,或。

根据您添加的上下文,我觉得您有一个

例如,SQL接受“SELECT*FROM users”之类的输入,解析并构建一个令牌树,然后进行解释

另一个例子:Java的正则表达式是一个解释器。像“[abc]+”这样的字符串被编译成标记,然后在执行时进行解释。您可以看到它在中使用的令牌(称为
节点
s)


稍后我将尝试发布一个简单的示例,但解释器模式不使用动态生成的代码。所有标记都是具体的类。您必须定义所有可能的(有效的)用户输入,以便您可以创建一个令牌来执行它。SQL和正则表达式有一个定义的语法,您也需要一个。

我认为Byte Buddy对您的情况很有帮助。这是一个开源项目,由一位非常受尊敬的Java开发人员维护

请看“学习”部分,其中有一个非常详细的示例:

是的,有反射。看看调用Java编译器和直接生成字节码之间的中间过程,有面向方面的编程。就我个人而言,这是一种“动态的,不知道的先验知识”。你如何以及何时知道你要做什么?为什么不能扩展接口?另外,您将使用什么环境?@Tagir Valeev,我正在寻找一种替代性的具体解决方案来解决上述问题。请您补充一下这是如何做到的,例如,通过反射、编译和@markspace,答案是在应用程序运行时;方法体是基于应用程序运行时的用户输入构建的。您自己能给出一些代码的示例吗?我很难想象你是如何从“用户输入”变成某种动态生成的方法的。