2015-07-02 6 views
25

से फील्ड नाम सूची प्राप्त करें मुझे केस क्लास के केवल फ़ील्ड नाम प्राप्त करने की आवश्यकता है, मुझे इसके मूल्यों में रूचि नहीं है। मैंने सोचा कि यह समस्या नहीं है और getClass.getDeclaredFields.map (_। GetName) मुझे फ़ील्ड नामों की एक सूची वापस कर देगा। और मुझे समान प्रश्न नहीं मिल रहा है।स्कैला। केस क्लास

scala> case class User(id: Int, name: String) 
defined class User 

scala> User.getClass.getDeclaredFields 
res14: Array[java.lang.reflect.Field] = Array(public static final User$ User$.MODULE$) 

scala> User.getClass.getDeclaredFields.toList 
res15: List[java.lang.reflect.Field] = List(public static final User$ User$.MODULE$) 

scala> val user = User(1, "dude") 
user: User = User(1,dude) 

scala> user.getClass.getDeclaredFields.toList 
res16: List[java.lang.reflect.Field] = List(private final int User.id, private final java.lang.String User.name) 

यह उपयोगकर्ता $ क्या है .MODULE $? वह क्या है? जब आप मामले वर्ग के उदाहरण मिल गया

विधि getDeclaredFields ठीक काम करता है, लेकिन मैं आदेश केवल क्षेत्रों

क्यों यह सच नहीं है प्राप्त करने के लिए एक उदाहरण बनाने के लिए नहीं करना चाहते? User.getClass.getDeclaredFields (_। GetName) == सूची ("आईडी", "नाम")

उत्तर

45

User.getClass का उपयोग करके, आप क्लास साथी ऑब्जेक्ट का जिक्र कर रहे हैं कि डिफ़ॉल्ट रूप से स्कैला केस क्लास के लिए बनाता है, न कि केस क्लास। केस क्लास की क्लास ऑब्जेक्ट प्राप्त करने के लिए, classOf[User] का उपयोग करें।

वैकल्पिक रूप से, आप स्काला के प्रतिबिंब एपीआई इस्तेमाल कर सकते हैं एक मामले वर्ग के मेटाडाटा को, जो आपको और अधिक जानकारी देता है पाने के लिए:

import scala.reflect.runtime.universe._ 

def classAccessors[T: TypeTag]: List[MethodSymbol] = typeOf[T].members.collect { 
    case m: MethodSymbol if m.isCaseAccessor => m 
}.toList 

एसबीटी कंसोल में टेस्ट:

scala> case class User(name: String, age: Int) 
defined class User 

scala> classAccessors[User] 
res0: List[reflect.runtime.universe.MethodSymbol] = List(value age, value name) 
+2

वे आते दिखाई देते हैं लेक्सो ऑर्डर में वापस। क्या उन्हें कोड में घोषित आदेश में वापस आने का कोई तरीका है? – samthebest

+1

इस उत्तर में एक धागा है जो बताता है कि क्रम में कैसे प्राप्त करें: http://stackoverflow.com/a/16079804/1586965 – samthebest

10

User.getClass आप जावा में User.class के बराबर नहीं देता है, लेकिन यह आप साथी के वर्ग देता है User कक्षा का उद्देश्य। आप User की classOf[User] के साथ पुनर्प्राप्त कर सकते हैं।

संपादित करें: ओह और User$.MODULE$ सिंगलटन उदाहरण के लिए एक एक्सेसर है जो आंतरिक रूप से उपयोग किया जाता है। जब आप जावा में सिंगलेट लिख रहे हों तो इसे MyClass.INSTANCE के समतुल्य के रूप में सोचें।

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