我已经能够使用scala和Reflection来获得case类的属性列表。
import scala.reflect.runtime.universe._
def classAccessors[T: TypeTag]: List[MethodSymbol] = typeOf[T].members.collect {
case m: MethodSymbol if m.isCaseAccessor => m
}.toList
case class Z(a1: String, b1: String, id: Integer)
val z = classAccessors[Z]
val res1 = z.map(x => if(x.equals("value id")) "xxx" else x)
然而,.equals
不工作,但没有给出错误-〉所以我错过了一些东西,我不能谷歌它。必须是一些基本的。.replace
不起作用,那会怎么样呢?
我怎样才能得到一个普通的List来处理呢?我注意到一个List[Object]
。在这方面也没有找到任何东西。嗯。有人能给予一个不使用反射的例子吗?
2条答案
按热度按时间wz3gfoph1#
x
具有类型MethodSymbol
,因此if(x.equals("value id")) "xxx" else x
具有类型Any
(又名Object
),因为这是String
和MethodSymbol
的最小超类型。而且
x.equals("value id")
总是false
,因为MethodSymbol
和String
是不同的类型。试试看
或
请注意,Java
.equals
类似于Scala==
,Java==
类似于Scalaeq
。ltskdhd12#
这个
val z = classAccessors[Z].map(_.toString())
解决了这个问题。不确定它背后的所有事实,但是List[Object]转到了List[String]。