在scala中运行时动态地将方法写入类,并创建一个jar

在scala中运行时动态地将方法写入类,并创建一个jar,scala,reflection,scala-reflect,scala-compiler,Scala,Reflection,Scala Reflect,Scala Compiler,我想了解是否有一种方法可以在运行时将方法写入现有类,并在scala中动态创建jar 到目前为止,我试图动态创建一个类,并能够通过反射运行它,但是该类是动态类,它不是生成的 val mirror = runtimeMirror(getClass.getClassLoader) val tb = ToolBox(mirror).mkToolBox() val function = q"def function(x: Int): Int = x + 2" val fun

我想了解是否有一种方法可以在运行时将方法写入现有类,并在scala中动态创建jar

到目前为止,我试图动态创建一个类,并能够通过反射运行它,但是该类是动态类,它不是生成的

val mirror = runtimeMirror(getClass.getClassLoader)
val tb = ToolBox(mirror).mkToolBox() 

val function = q"def function(x: Int): Int = x + 2"
    val functionWrapper = "object FunctionWrapper { " + function + "}"
data.map(x => tb.eval(q"$functionSymbol.function($x)"))
我从其他来源得到这个,但是这个类只在这次运行中可用,不会被生成

val mirror = runtimeMirror(getClass.getClassLoader)
val tb = ToolBox(mirror).mkToolBox() 

val function = q"def function(x: Int): Int = x + 2"
    val functionWrapper = "object FunctionWrapper { " + function + "}"
data.map(x => tb.eval(q"$functionSymbol.function($x)"))
我希望在运行时向现有类添加一个函数,并能够编译它并为它创建一个jar

请给我指路


提前谢谢。

我想您提供的代码片段应该是这样的

import scala.reflect.runtime.universe._
import scala.tools.reflect.ToolBox

val mirror = runtimeMirror(getClass.getClassLoader)
val tb = ToolBox(mirror).mkToolBox()

val function: Tree = q"def function(x: Int): Int = x + 2"
val functionWrapper: Symbol = tb.define(q"object FunctionWrapper { $function }".asInstanceOf[ImplDef])
val data: List[Tree] = List(q"1", q"2")
data.map(x => tb.eval(q"$functionWrapper.function($x)")) // List(3, 4)
。。。但是,该类是动态类,未生成。

。。。但是,该类仅可用于此运行,不会生成

您是如何检查该类是否未生成的?(哪个类,
FunctionWrapper
?)

是否有一种方法可以在运行时将方法写入现有类,并在scala中动态创建jar

我希望在运行时向现有类添加一个函数,并能够编译它并为它创建一个jar

什么是“现有类”?你能接触到它的来源吗?然后你可以修改源代码,编译它们等等

类是否作为
.class
文件存在?您可以使用、等修改其字节码,使用等插入字节码

它是动态类(如上面的
FunctionWrapper
)吗?你是怎么创造的?(对于
FunctionWrapper
,您可以访问其
符号
,以便在其他源代码中使用。)

类是否已加载?然后您必须使用类加载器(卸载、修改、加载修改)


这听起来是个糟糕的主意。@LuisMiguelMejíaSuárez我们将收到一个字符串,根据它,我们需要在运行时将此作为方法添加到类中,并需要生成一个jar。所以我开始先创建一个动态类,但不能在这里生成。但是我需要将函数添加到现有的类中。我们可能会实际收到一个表达式,基于我们需要创建的表达式,它是一个用于spark udf创建的方法。那么这些表达式看起来是什么样的呢?通常,最好使用一种限制性语言,允许用户准确地表达所需内容,而不需要更多。然后可以使用称为部分求值的技术将此表达式编译成函数对象。具有编程背景的人将在udf可用后使用udf。我想了解如何生成一个类并将其与jar动态绑定。感谢您提供的信息Dmytro。。1.是,未生成FunctionWrapper类。2.好的,我来看看字节-buddy@user3569397在什么意义上不生成
FunctionWrapper
?你有它的符号,你可以在其他来源中使用它。如何检查它是否未生成?如果你用
toolbox(mirror).mkToolBox(options=“-d/path/to/dir”)
创建工具箱,那么在
dir
中你会找到
函数包装器的
.class
文件。没有
-d
选项,它是在内存中的虚拟目录中创建的。您好,Dmytro,如果我没有正确解释,我深表歉意。我试着签入源程序包。我可以请求您在哪里检查创建的类吗?@user3569397它不在
src/main/scala…
中,而是在
dir
中,您用
-d
键在
options
参数
mkToolBox
中指定,否则它在内存中(默认情况下)。