2013-04-26 56 views
24

在java類java.util.Locale中,我發現關鍵字transient標記了一個方法。瞬態關鍵字可以標記一個方法嗎?

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 2013-04-26 10:15:28

+1

我檢查了jdk 1.6源代碼,它沒有'transient'關鍵字 – sanbhat 2013-04-26 10:17:27

+4

相關:http://stackoverflow.com/questions/4936803/why-java-methods-with-varargs-identified-as-transient – harsh 2013-04-26 10:19:28

回答

43

不,它只能用於字段。您似乎通過反編譯從.class獲取源代碼。這是反編譯器的bug,如果你看看java.lang.reflect.Modifier src時,您會看到transientvarargs具有相同的價值

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(字節碼)可變參數是由對象表示[]的最後一個參數+改性劑的第7位= 1(0x80的)。我猜這個反編譯器是舊的,根本不知道自從Java 1.5以來的varargs,所以它打印爲transient

0

這必須是一個錯誤。還是一些錯誤版本?瞬態僅適用於變量。你能提供一個你看到的鏈接嗎?

1

Java文檔指出,短暫的關鍵字僅適用於實例變量,所以這doesn't使

3

transient只能應用於成員變量,而不是方法任何意義所以這裏有一個問題。

看在你的代碼中的變量名 - 像String sObject[] aboj的東西 - 它看起來像這樣源已被反編譯相關.class文件生成。

我認爲你使用的反編譯器有一個錯誤,它錯誤地將transisent添加到方法聲明中。

6

如果該代碼已經被反編譯它是最有可能這樣的結果:Why Java methods with varargs identified as transient?

我從那裏報價:

答案的排序可以在代碼中發現了Javassist AccessFlag

public static final int TRANSIENT = 0x0080; public static final int VARARGS = 0x0080;它們看起來都具有相同的值。並且由於 瞬態對於方法沒有任何意義,而可變參數對於 字段沒有任何意義,所以它們可以相同。

相關問題