2013-06-11 8 views
7

Ich versuche, eine Anmerkung in Scala Reflexion und bisher keine Würfel zu sehen. Was vermisse ich?Siehe Anmerkungen in Scala Reflexion

Meine Anmerkung: (Java)

@Target({ElementType.PARAMETER}) // Also tried ElementType.CONSTRUCTOR 
@Retention(RetentionPolicy.RUNTIME) 
public @interface MongoKey { 
    String info = ""; 
} 

Und der Teil, der es mit Scala Reflexion zuzugreifen versucht:

case class One( 
@MongoKey name : String, 
    stuff : List[String] 
) 

val targetObj = One("FOO", List("a","b")) 
val targetType = typeOf[One] 

// Given an object (case class) the Type of the case class, and a field name, 
// retrieve the typed field object from the case class. 
def unpack[T](target: T, t: Type, name: String): (Any, Type) = { 
    val im = cm.reflect(target)(ClassTag(target.getClass)) 
    val fieldX = t.declaration(newTermName(name)).asTerm.accessed.asTerm 
    val fm = im.reflectField(fieldX) 
    (fm.get, fm.symbol.typeSignature) // return the field's value + Type 
} 

val (pval,pvalType) = SeeMe.unpack(targetObj, targetType, "name") 
println(" -> "+pvalType.typeSymbol.annotations) 

Der Ausgang ist eine erfolgreiche Traversal meines Falles Klasse Feld, aber die Anmerkung Die Liste ist immer leer, auch wenn ich ein Feld der Klasse mit meiner @MongoKey-Anmerkung dekoriere. Sehe ich an der falschen Stelle?

Antwort

4

Das ist knifflig! Die Annotation bezieht sich nicht auf das Member Ihrer Klasse, sondern auf den Parameter in der apply-Methode Ihres Companion-Objekts!

Von Ihrem Typ, sollten Sie in der Lage sein, den Begleiter-Objekt erhalten mit:

val companion = myType.typeSymbol.companionSymbol 

Von dort können Sie mithilfe von Reflektion auf die Parameter der apply Methode suchen.

+1

val applyAnno = symbol.companionSymbol.typeSignature.members.collectFirst { fallmethode: MethodSymbol if (method.name.toString == "apply") => method.paramss.head.collect {fall p if (p. annotations.find (a => a.tpe == SeeMe.hintType) .isDefined) => p.name.toString} } .get – Greg

+0

Schön! Sie erhalten meinen Upvote, um mit Ihrer endgültigen Lösung zu posten. – Andy