假设我有以下java接口:
public interface DynamicMethod {
String doit();
}
我想在运行时建立一个对象,符合上面的接口,这样我注入doit方法体,然后执行它?这是可能的Java反射API,或任何其他方式?或者在Scala中以某种方式?
注意,我的对象的doit
主体将是动态的,并且不是先验的。您可以假设在运行时提供了一个字符串数组CodeArray[1..10]
,该数组的每个条目包含每个doit方法的代码。如果您能提供一个示例代码,我将不胜感激。
的背景:我试图解释问题的背景;尽管如此,上述问题仍然独立于上下文。
我有一些命令说C1,C2,…;每条命令都有一定的参数。根据命令及其参数,系统需要执行特定的任务(可以使用java代码表示)。我需要根据用户需求存储这些命令以供将来执行(因此上面的CodeArray[1..10]
保存了java代码列表)。例如,用户从列表(即从数组)中选择命令并要求执行该命令。
我的想法是构建一个基于用户选择的引擎,从数组中加载相应的命令代码并执行它。
您添加的上下文,听起来像您有一个解释器。
例如,SQL接受"SELECT * FROM users"这样的输入,解析并构建一个令牌树,然后对其进行解释。
另一个例子:Java的正则表达式是一个解释器。像"[abc]+"这样的字符串被编译成令牌,然后在执行时进行解释。您可以在源代码中看到它使用的令牌(称为Node
s)。
我认为Byte Buddy会对你的情况有所帮助。它是一个开源项目,由一位非常受人尊敬的Java开发人员维护。
看看学习部分,他们有一个非常详细的例子:http://bytebuddy.net//教程
目前还不清楚你的目标是什么。根据您的需求,有许多方法可以做到这一点。
在某些情况下,创建Proxy
和InvocationHandler
就足够了。有时生成Java源代码是合理的,然后在运行时调用JavaCompiler
并使用URLClassLoader
加载生成的类(如果您谈论的是代码字符串,可能就是这种情况)。有时使用ASM、cglib或BCEL等库直接创建字节码会更好。