如何解决在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-buddy,ASM,Javassist,cglib等来修改其字节码,并使用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?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。