scala:如何通过变量名作为字符串输入来创建返回类变量值的类方法

oknrviil  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(387)

我是scala的新手,我正在尝试在scala中编写一个类方法,它将类变量名(作为字符串)作为输入并返回该变量值。假设我有课 Person 带变量 name 以及 age .
我需要一个方法 getVar 在课堂上 Person 哪个可以

//Expected output in comments next to a method call

val p1 = new Person(name="abc",age=23);
p1.getVar("age"); //Returns 23
p1.getVar("name"); //Returns "abc"

我不知道我该如何通过名称引用 getVar 方法。任何帮助都将不胜感激

cotxawn7

cotxawn71#

你可以使用反射。

import scala.reflect.ClassTag
import scala.reflect.runtime.universe._

abstract class FieldRequestSupport[SelfType <: Product : ClassTag : TypeTag] {
    self: SelfType =>

    private val classFieldsAccessors: Map[String, MethodSymbol] = typeOf[SelfType].members.collect({
        case m: MethodSymbol if m.isCaseAccessor => m
    }).flatMap(symbol => TermName.unapply(symbol.name).map((_, symbol)))(collection.breakOut)
    private val classMirror: Mirror = runtimeMirror(getClass.getClassLoader)

    def requestField(fieldName: String): Option[Any] = {
        classFieldsAccessors.get(fieldName).map(
            symbol => classMirror.reflect(self).reflectField(symbol).get
        )
    }
}

case class Person(name: String, age: Int) extends FieldRequestSupport[Person]

object Test extends App {
    val person = Person("Bob", 26)
    println(person.requestField("name")) //will print Some(Bob)
    println(person.requestField("age")) //will print Some(26)
    println(person.requestField("qqq")) //will print None
}

相关问题