2016-03-25 3 views
0

特定のタイプのすべてのフィールドをすべての親クラスを含むオブジェクトインスタンスから取得するにはどうすればよいですか? BaseSetのためにこの方法がうまく動作しリフレクトを介して特定のパブリックフィールドを取得する(すべての親クラス用)

import scala.reflect.runtime.universe._ 
import scala.reflect.runtime.{universe => ru} 

def find(instance: Any): List[Target] = { 
    val m = ru.runtimeMirror(instance.getClass.getClassLoader) 
    val i = m.reflect(instance) 

    i.symbol.typeSignature.decls.flatMap { 
     case f: TermSymbol if !f.isMethod => i.reflectField(f).get match { 
     case d: Target => Some(d) 
     case _ => None 
     } 
     case _ => None 
    }.toList 
} 

:私はすべてのTargetのフィールドを取得するための書き込み方法を試してみた

trait Target { 
    val message: String 
    def action: Unit = println("hello", message) 
} 

class ConcreteTarget(val message: String) extends Target 

trait BaseSet { 
    val s = "" 
    val t1 = new ConcreteTarget("A") 
    val t2 = new ConcreteTarget("B") 
    val a = 123 
} 

class ExtendedSet extends BaseSet { 
    val t3 = new ConcreteTarget("C") 
    val f = "111" 
} 

find(new BaseSet{}) foreach (_.action) 
//> (hello,A) 
//> (hello,B) 

は例えば、これらのクラスがあります

しかし、公開されているフィールドはです、親フィールドは見つかりません:

find(new ExtendedSet) foreach (_.action) 
//> (hello,C) 

何が問題なのですか?

答えて

1

declsには継承されたメンバーは含まれません。あなたはmembersを探しています。

関連する問題