あなたが解決しようとしている問題、例えば、標準的なオブジェクトのシリアル化を使用したくない理由などについて、より良いアイデアがあれば、ここで支援しやすくなります。
とはいえ、本当に Scala コレクション クラスのリフレクションを行いたい場合は、現在 Scala がそのクラスとオブジェクトをどのようにコンパイルしているかについて、おそらくいくつか知っておく必要があります。
(List クラスではなく) List オブジェクトのクラスが必要な場合、名前はscala.collection.immutable.List$
- 最後のドル記号に注意してください。
シングルトン List オブジェクト インスタンスが必要な場合は、 field として格納されますMODULE$
。
ほとんどの scala コレクション コンパニオン オブジェクトは、 ( ) メソッドnewBuilder
を持つオブジェクトを作成するメソッドと、新しいコレクションを作成できるメソッドを提供します。+=
$plus$eq
result
したがって、次のようなことができます。
scala> def buildByReflection[T](collectionClassName: String, items: Array[T]) = {
| val companionClass = Class.forName(collectionClassName + "$")
| val companion = companionClass.getField("MODULE$").get(null)
| val newBuilder = companionClass.getMethod("newBuilder")
| val builder = newBuilder.invoke(companion)
| val plusEq = builder.getClass.getMethod("$plus$eq", classOf[Object])
| for (item <- items) {
| plusEq.invoke(builder, item.asInstanceOf[AnyRef])
| }
| builder.getClass.getMethod("result").invoke(builder)
| }
buildByReflection: [T](collectionClassName: String,items: Array[T])java.lang.Object
scala> buildByReflection("scala.collection.immutable.List", Array(1, 2, 3))
res0: java.lang.Object = List(1, 2, 3)