反射フィールドの値で設定するScalaアプリを作成しています。これは問題なく動作します。
ただし、フィールド値を設定するには、インスタンスを作成する必要があります。空のコンストラクターを持つクラスがある場合、classOf [Person].getConstructors...を使用してこれを簡単に行うことができます。
ただし、空でないコンストラクターを使用してCaseクラスでこれを実行しようとすると、機能しません。すべてのフィールド名とその値、および作成する必要のあるオブジェクトタイプがあります。自分が持っているものを使って、Case Classをなんとかしてインスタンス化できますか?
私が持っていないのは、Case Classコンストラクターからのパラメーター名、またはパラメーターなしでこれを作成し、リフレクションを介して値を設定する方法だけです。
例に行きましょう。
私は以下を持っています
case class Person(name : String, age : Int)
class Dog(name : String) {
def this() = {
name = "Tony"
}
}
class Reflector[O](obj : O) {
def setValue[F](propName : String, value : F) = ...
def getValue(propName : String) = ...
}
//This works
val dog = classOf[Dog].newInstance()
new Reflector(dog).setValue("name", "Doggy")
//This doesn't
val person = classOf[Person].newInstance //Doesn't work
val ctor = classOf[Person].getConstructors()(0)
val ctor.newInstance(parameters) //I have the property names and values, but I don't know
// which of them is for each parameter, nor I name the name of the constructor parameters