2013-06-11 4 views
7

में एनोटेशन देखें, मैं स्कैला प्रतिबिंब में एक टिप्पणी देखने की कोशिश कर रहा हूं और अब तक कोई पासा नहीं है। मैं क्या खो रहा हूँ?स्कैला प्रतिबिंब

मेरे एनोटेशन: (जावा)

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

और भाग स्काला प्रतिबिंब का उपयोग कर इसे उपयोग करने की कोशिश करता है:

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) 

उत्पादन मेरे मामले वर्ग 'फ़ील्ड लेकिन एक सफल ट्रेवर्सल है एनोटेशन सूची हमेशा खाली होती है, भले ही मैं कक्षा के एक क्षेत्र को अपने @MongoKey एनोटेशन के साथ सजाने के लिए तैयार करता हूं। क्या मेरी तलाश गलत स्थान पर हो रही है?

उत्तर

4

यह मुश्किल है! एनोटेशन आपकी कक्षा के सदस्य पर नहीं है, बल्कि वास्तव में आपके साथी ऑब्जेक्ट की लागू विधि में पैरामीटर पर है!

val companion = myType.typeSymbol.companionSymbol 

वहां से आप प्रतिबिंब का उपयोग कर सकते apply विधि के लिए मानकों को देखने के लिए:

अपने प्रकार से, आप के साथ साथी वस्तु प्राप्त करने के लिए सक्षम होना चाहिए।

+1

वैल लागूएनो = symbol.companionSymbol.typeSignature.members.collectFirst { केस विधि: विधि सिंबल अगर (method.name.toString == "लागू करें") => method.paramss.head.collect {case p if (p। annotations.find (a => a.tpe == SeeMe.hintType) .isDefined) => p.name.toString} } .get – Greg

+0

अच्छा! आपको अपने अंतिम समाधान के साथ वापस पोस्ट करने के लिए मेरा उपरोक्त मिलता है। – Andy

संबंधित मुद्दे