2016-04-14 5 views
8

में संशोधक जब org.apache.log4j.Logger के लिए वर्ग फ़ाइल में देख यह नाम class$org$apache$log4j$Logger साथ प्रकार Class के एक सिंथेटिक क्षेत्र को परिभाषित करता है।अस्पष्ट क्षेत्र और log4j लॉगर

बाइट कोड को देखने से, यह स्पष्ट है कि यह फ़ील्ड स्वयं-संदर्भित वर्ग का प्रतिनिधित्व उस समय से करती है जहां निरंतर पूल अभी तक संदर्भ प्रकार नहीं दे सकता है। हालांकि मैं अजीब लगता हूं कि इस क्षेत्र का संशोधक 0x41008 है जो private, synthetic फ़ील्ड इंगित करता है (जो मैं अनुसरण कर सकता हूं) लेकिन जो एक संशोधक 0x40000 जोड़ता है जिसे मैं कहीं भी दस्तावेज नहीं ढूंढ सकता।

यह संशोधक बिट 1 पर कहां से आता है और यह क्या व्यक्त करता है? (Log4j जावा 1 के लिए संकलित है)।

+0

यह निरंतर पूल नहीं है जो कि संदर्भों का संदर्भ नहीं दे सका, लेकिन 'एलडीसी' निर्देश जो 'क्लास' ऑब्जेक्ट को ऑपरेंड स्टैक पर लोड नहीं कर सका। लेकिन कक्षा निरंतर पूल प्रकार पहले से ही 'इस' और 'सुपर' प्रकार को निर्दिष्ट करने, संदर्भित इंटरफेस और संदर्भित सदस्यों के वर्गों की घोषणा करने के लिए मौजूद है। – Holger

उत्तर

6

javap कि वर्ग फ़ाइल के साथ पूरी तरह से खुश है:

static java.lang.Class class$org$apache$log4j$Logger; 
    descriptor: Ljava/lang/Class; 
    flags: ACC_STATIC 
    Synthetic: true 

access_flags u2 होने के लिए, 2-बाइट अहस्ताक्षरित अर्थ अपेक्षा की जाती है। यह 0x41008 देखने के लिए परेशान है, जो u2 से बड़ा है। कुछ औजारों को एक्सेस_फ्लैग को बड़े प्रकार में स्टोर करने के लिए जाना जाता है, और सहायक बिट्स (एएसएम करता है, जेवीएम इसे करता है, इत्यादि) मुझे पता है कि आप एएसएम के साथ पढ़ रहे हैं, इसलिए शायद यह आप देख रहे हैं:

org/objectweb/ASM/ClassReader.java:

 } else if ("Synthetic".equals(attrName)) { 
      access |= Opcodes.ACC_SYNTHETIC 
        | ClassWriter.ACC_SYNTHETIC_ATTRIBUTE; 

org/objectweb/ASM/ClassWriter.java:

/** 
* Pseudo access flag to distinguish between the synthetic attribute and the 
* synthetic access flag. 
*/ 
static final int ACC_SYNTHETIC_ATTRIBUTE = 0x40000; 

सवाल है, यह आप के लिए लीक करता है ...

+2

यह एएसएम पर आधारित है और जवाप पर आधारित बाइट कोड पढ़ने के लिए IntelliJs प्लगइन का उपयोग करके लीक करता है। आधिकारिक टूलिंग पर भरोसा किया जाना चाहिए था। धन्यवाद! –

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