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

问题描述

我想了解是否有一种方法可以在运行时向现有类编写方法,并在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)"))

我是从其他来源获得的,但是该类仅可用于此运行,并且不会生成

我想在运行时向现有类中添加一个函数,并能够对其进行编译并为其创建一个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文件的形式存在?您可以使用Byte-buddyASMJavassistcglib等来修改其字节码,并使用aspects等来检测其字节码。

它是动态类(例如上面的FunctionWrapper)吗?您是如何创建的? (对于FunctionWrapper,您可以访问其Symbol,因此可以在其他资源中使用它。)

该类是否已已加载?然后,您将不得不使用类加载器(卸载,修改,修改加载)。

Can a Java class add a method to itself at runtime?

In Java,given an object,is it possible to override one of the methods?