可能重复:
编译包含Java文件和代码阶
我知道,斯卡拉可以方便地使用Java类。 然而,是否有可能包括斯卡拉文件中Java源代码,并已经将其与scalac编译,以任何方式?
可替代地,是有可能包括的javac-编译的字节代码作为源的ByteArray,和导入从它(呸,是)?
这是家庭作业,所以,不,我不能有单独的文件,并且必须与编译scalac file.scala
,没有额外的参数。 为了澄清,这是我的老师硬必要
可能重复:
编译包含Java文件和代码阶
我知道,斯卡拉可以方便地使用Java类。 然而,是否有可能包括斯卡拉文件中Java源代码,并已经将其与scalac编译,以任何方式?
可替代地,是有可能包括的javac-编译的字节代码作为源的ByteArray,和导入从它(呸,是)?
这是家庭作业,所以,不,我不能有单独的文件,并且必须与编译scalac file.scala
,没有额外的参数。 为了澄清,这是我的老师硬必要
如果你想要写Scala代码文字字节数组,很容易从去一个普通的Java类,只需通过调用Classloader.defineClass
。 这意味着你需要让自己的子类ClassLoader
暴露出这种方法的重载之一。 这是Scala中没有太多的麻烦全部是可行的。
如果你认真准备这个,你甚至可以得到类型安全,通过使你的类 - 从 - 字节组实现您在Scala中定义的接口。 我不知道这个确切的细节,但我记得那是可能的一个Java类的子类/实现在Scala中定义的东西。 如果做不到这一点,你一定在您的处置反映。
我只是写了一个简单的例子
假设你有一个Java类,像这样
public class HelloWorld {
public static void main(String[] args) {
System.out.println("hello world");
}
}
然后,你写一些Scala代码来把它转换成一个字节数组
import java.io.{FileInputStream, FileOutputStream}
import collection.mutable.ArrayBuffer
val in = new FileInputStream("HelloWorld.class")
val out = new FileOutputStream("HelloWorldBytes.scala")
Console.withOut(out) {
var data = in.read()
print("val helloWorldBytes = Array[Byte](")
print(if(data < 128) data else data - 256)
data = in.read()
while(data >= 0) {
print(", ")
print(if(data < 128) data else data - 256)
data = in.read()
}
println(")")
}
in.close()
out.close()
然后你就可以使用它像这样
val helloWorldBytes = Array[Byte](...)
object Loader extends ClassLoader {
override
def findClass(name: String): Class[_] =
if(name == "HelloWorld") defineClass(name, helloWorldBytes, 0, helloWorldBytes.size)
else super.findClass(name)
}
val helloWorld = Loader.loadClass("HelloWorld")
helloWorld.getDeclaredMethod("main", classOf[Array[String]]).invoke(null,null)
你可以使用BCEL和指定javac的衍生指令列表在斯卡拉,但我真的不能想象这是怎样以任何方式实际。 做你想做什么,最简单的方法是使用(比方说)Maven的斯卡拉插件来编译Java和Scala的文件放在一起。