1

重複の可能性:
java および scala コードを含むコンパイル ファイル

Scala が Java クラスを簡単に使用できることは承知しています。しかし、Java ソースを scala ファイルに含めて、それを scalac でコンパイルすることはできますか?

または、javac でコンパイルされたバイトコードをバイト配列としてソースに含めて、そこからインポートすることは可能ですか (うん、はい)?

これは宿題なので、別のファイルを持つことはできず、追加の引数なしで でコンパイルする必要があります。scalac file.scala明確にするために、これは私の先生からの難しい要件です

4

3 に答える 3

3

Scala コードでリテラル バイト配列を記述したい場合は、単に を呼び出すだけで、そこから通常の Java クラスに簡単に移行できClassloader.defineClassます。ClassLoaderこれは、このメソッドのオーバーロードの 1 つを公開する独自のサブクラスを作成する必要があることを意味します。これはすべて Scala で問題なく実行できます。

これを注意深く準備すれば、class-from-bytearray に Scala で定義したインターフェースを実装させることで、タイプ セーフを実現することさえできます。これについての正確な詳細はわかりませんが、Java クラスが Scala で定義されたものをサブクラス化/実装することが可能だったことを覚えています。そうでなければ、あなたは確かに自由に反省することができます。

于 2012-11-25T19:51:59.520 に答える
3

簡単な例を書いてみました

このようなJavaクラスがあるとします

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("hello world");
    }
}

次に、それをバイト配列に変換するためのスカラ コードを記述します。

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)
于 2012-11-25T21:02:05.880 に答える
1

BCEL使用て、ScalaでJavacから派生した命令リストを指定することもできますが、これがどのように実用的であるかは想像できません。必要なことを行う最も簡単な方法は、(たとえば)Maven scalaプラグインを使用して、JavaファイルとScalaファイルの両方を一緒にコンパイルすることです。

于 2012-11-25T19:34:21.543 に答える