2013-04-26 12 views
24

जावा क्लास java.util.Locale में, मुझे लगता है कि कीवर्ड क्षणिक ने एक विधि चिह्नित की है।क्षणिक कीवर्ड एक विधि चिह्नित कर सकते हैं?

public final class Locale 
    implements Cloneable, Serializable 
{ 
    private static class LocaleNameGetter 
     implements sun.util.LocaleServiceProviderPool.LocalizedObjectGetter 
    { 

     public transient String getObject(LocaleNameProvider localenameprovider, Locale locale, String s, Object aobj[]) 
     { 
      if(!$assertionsDisabled && aobj.length != 2) 
       throw new AssertionError(); 
      int i = ((Integer)aobj[0]).intValue(); 
      String s1 = (String)aobj[1]; 
      switch(i) 
      { 
      case 0: // '\0' 
       return localenameprovider.getDisplayLanguage(s1, locale); 

      case 1: // '\001' 
       return localenameprovider.getDisplayCountry(s1, locale); 

      case 2: // '\002' 
       return localenameprovider.getDisplayVariant(s1, locale); 
      } 
      if(!$assertionsDisabled) 
       throw new AssertionError(); 
      else 
       return null; 
     } 

क्या कोई मुझे बता सकता है कि यह क्यों हो सकता है?

+0

@ user85121 क्या आप लिंक प्रदान कर सकते हैं जहां आप इसे देखते हैं? – Eugene

+1

मैंने jdk 1.6 स्रोत की जांच की है और इसमें 'क्षणिक' कीवर्ड नहीं है – sanbhat

+4

संबंधित: http://stackoverflow.com/questions/4936803/why-java-methods-with-varargs-identified-as-transient – harsh

उत्तर

43

नहीं, यह नहीं हो सकता है, यह केवल फ़ील्ड के लिए मान्य है। आपको डिकंपलिंग द्वारा क्लास से अपना स्रोत प्राप्त होता है। यह, decompiler बग है अगर आप java.lang.reflect.Modifier आप src पर एक नज़र डालें कि transient और varargs एक ही मूल्य

public static final int TRANSIENT  = 0x00000080; 
... 
static final int VARARGS = 0x00000080; 

है देखेंगे एक क्षेत्र 0x00000080 के लिए transient का मतलब है, एक विधि (अपने मामले) इसका मतलब है varargs के लिए। यह कैसे getObject java.util.Locale src

public String getObject(LocaleNameProvider localeNameProvider, 
         Locale locale, 
         String key, 
         Object... params) { <-- varargs 

में की तरह दिखता है .class (बाईटकोड) में varargs वस्तु का प्रतिनिधित्व करती है [] है पिछले पैरामीटर + संशोधक बिट 7 = 1 (0x80) के रूप में। मुझे लगता है कि डिकंपेलर पुराना है और बस varargs के बारे में नहीं जानता जो कि जावा 1.5 के बाद से है, इसलिए इसे transient के रूप में मुद्रित किया गया है।

0

यह एक बग होना चाहिए। या कुछ छोटी गाड़ी संशोधन? क्षणिक केवल चर पर लागू होता है। क्या आप एक लिंक प्रदान कर सकते हैं जहां आप इसे देखते हैं?

1

जावा प्रलेखन कहा गया है कि क्षणिक कीवर्ड केवल उदाहरण चर पर लागू होता है तो यह नहीं करता है कोई मतलब

3

transient केवल तरीकों के सदस्य चर के लिए लागू किया जा सकता है और नहीं कर तो वहाँ एक समस्या यहाँ है।

चर अपने कोड में नाम को देखते हुए - String s और Object[] aboj तरह बातें - ऐसा लगता है कि इस स्रोत decompiling प्रासंगिक .class फ़ाइल द्वारा उत्पन्न हो रहा है।

मुझे लगता है कि आप जिस भी डिकंपेलर का उपयोग कर रहे हैं उसमें एक बग है जो विधि घोषणा के लिए गलती से transisent जोड़ रहा है।

6

इस कोड को यह सबसे अधिक संभावना इस का एक परिणाम है decompiled कर दिया गया है: Why Java methods with varargs identified as transient?

मैं वहाँ से उद्धृत कर रहा हूँ:

एक जवाब की क्रमबद्ध के कोड में पाया जा सकता javassist AccessFlag

सार्वजनिक स्थिर अंतिम int TRANSIENT = 0x0080; सार्वजनिक स्थिर अंतिम int VARARGS = 0x0080; ऐसा लगता है कि दोनों के पास समान मूल्य हैं। और क्षणिक साधनों के लिए कुछ भी नहीं है, जबकि varargs का अर्थ फ़ील्ड के लिए कुछ भी नहीं है, उनके लिए यह ठीक है।

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