2015-02-10 13 views
5

Tôi muốn (tĩnh) phản ánh một lớp học mẫu như thế này:Cách tốt nhất để phản ánh các trường kiểu lớp trong scala 2.11 là gì?

case class Foo[T,U](stuff:T, more:U, age:Int) { 
    val ignore:Boolean = false 
} 

tôi bắt đầu như thế này:

val symbol = currentMirror.classSymbol(clazz) // symbol is universe.ClassSymbol 
// I want to know about type placeholders T and U 
val typeParamArgs = symbol.typeParams.map(tp => tp.name.toString) 
if(symbol.isCaseClass) { 
    val tsig = symbol.typeSignature 
    println(tsig) 
} 

Ok, vào thời điểm này nếu tôi in Tsig tôi thấy:

[T, U]scala.AnyRef 
     with scala.Product 
     with scala.Serializable { 
    val stuff: T 
    private[this] val stuff: T 
    val more: U 
    private[this] val more: U 
    val age: scala.Int 
    private[this] val age: scala.Int 
    def <init>(stuff: T,more: U,age: scala.Int): co.blocke.Foo[T,U] 
    val ignore: scala.Boolean 
    private[this] val ignore: scala.Boolean 
    def copy[T, U](stuff: T,more: U,age: scala.Int): co.blocke.Foo[T,U] 
    def copy$default$1[T, U]: T @scala.annotation.unchecked.uncheckedVariance 
    def copy$default$2[T, U]: U @scala.annotation.unchecked.uncheckedVariance 
    def copy$default$3[T, U]: scala.Int @scala.annotation.unchecked.uncheckedVariance 
    override def productPrefix: java.lang.String 
    def productArity: scala.Int 
    def productElement(x$1: scala.Int): scala.Any 
    override def productIterator: Iterator[scala.Any] 
    def canEqual(x$1: scala.Any): scala.Boolean 
    override def hashCode(): scala.Int 
    override def toString(): java.lang.String 
    override def equals(x$1: scala.Any): scala.Boolean 
} 

Xem dòng ở giữa với <init>? Đó là tuyên bố tôi muốn nhìn vào. Nó có những gì tôi cần.

Làm cách nào để tôi có thể chọn tsig (universe.Type) để nhận thông tin về <init>? (Tôi không muốn thông tin về 'bỏ qua'.)

Trả lời

3

Thay vì kiểm tra của .typeSignature lớp, kiểm tra các loại chữ ký của các nhà xây dựng với .primaryConstructor.typeSignature:

val csig = symbol.primaryConstructor.typeSignature 
val params = csig.paramLists.head // paramLists returns a List of Lists 

này cung cấp cho bạn một danh sách các thông số của hàm tạo chính, vì vậy bạn có thể truy vấn tên, loại, v.v.

scala> params(1).name 
res47: reflect.runtime.universe.Symbol#NameType = more 

scala> params(2).typeSignature 
res48: reflect.runtime.universe.Type = scala.Int 
Các vấn đề liên quan