2013-06-11 25 views
7

Scala yansımasında bir açıklama görmeye çalışıyorum ve şu ana kadar hiç bir zar yok. Neyi kaçırıyorum?Scala yansımasındaki ek açıklamalara bakın.

Benim Ek Açıklama: (Java)

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

Ve Scala yansıma kullanarak erişmeye kısmı:

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) 

çıktı dosyamın sınıfı alanına ancak başarılı bir geçişi olan Açıklama Not @MongoKey ek açıklama ile sınıfın bir alanını dekore etsem bile liste her zaman boştur. Yanlış yere mi bakıyordum?

cevap

4

Bu zor bir işlemdir! Ek açıklama, sınıfınızın üyesi üzerinde değil, aslında tamamlayıcı nesnesinin başvuru yöntemindeki parametrede! Eğer apply yönteme parametrelere bakmak için yansıma kullanabilirsiniz Oradan

val companion = myType.typeSymbol.companionSymbol 

: türünüze itibaren

, sen ile refakatçi nesneyi almak mümkün olmalıdır.

+1

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

+0

Güzel! Son çözümünle geri göndermek için elimden geleni yapıyorsun. – Andy

İlgili konular