包括斯卡拉文件Java源[复制](Include java source in scala file

2019-10-17 10:51发布

可能重复:
编译包含Java文件和代码阶

我知道,斯卡拉可以方便地使用Java类。 然而,是否有可能包括斯卡拉文件中Java源代码,并已经将其与scalac编译,以任何方式?

可替代地,是有可能包括的javac-编译的字节代码作为源的ByteArray,和导入从它(呸,是)?

这是家庭作业,所以,不,我不能有单独的文件,并且必须与编译scalac file.scala ,没有额外的参数。 为了澄清,这是我的老师硬必要

Answer 1:

如果你想要写Scala代码文字字节数组,很容易从去一个普通的Java类,只需通过调用Classloader.defineClass 。 这意味着你需要让自己的子类ClassLoader暴露出这种方法的重载之一。 这是Scala中没有太多的麻烦全部是可行的。

如果你认真准备这个,你甚至可以得到类型安全,通过使你的类 - 从 - 字节组实现您在Scala中定义的接口。 我不知道这个确切的细节,但我记得那是可能的一个Java类的子类/实现在Scala中定义的东西。 如果做不到这一点,你一定在您的处置反映。



Answer 2:

我只是写了一个简单的例子

假设你有一个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)


Answer 3:

可以使用BCEL和指定javac的衍生指令列表在斯卡拉,但我真的不能想象这是怎样以任何方式实际。 做你想做什么,最简单的方法是使用(比方说)Maven的斯卡拉插件来编译Java和Scala的文件放在一起。



文章来源: Include java source in scala file [duplicate]