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?
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
Schön! Sie erhalten meinen Upvote, um mit Ihrer endgültigen Lösung zu posten. – Andy