2013-04-26 26 views
24

W java klasy java.util.Locale, stwierdzam, że słowo kluczowe przejściowy oznaczono metodą.Czy przejściowe słowa kluczowe mogą oznaczać metodę?

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; 
     } 

Czy ktoś może mi powiedzieć, dlaczego to możliwe?

+0

@ user85121 Czy możesz podać link tam, gdzie to widzisz? – Eugene

+1

Sprawdziłem źródło jdk 1.6 i nie ma słowa "przejściowe" – sanbhat

+4

Powiązane: http://stackoverflow.com/questions/4936803/why-java-methods-with-varargs-identified-as-transient – harsh

Odpowiedz

43

Nie, nie może, dotyczy tylko pól. Wydaje się, że dostajesz swoje źródło z .class przez dekompilację. Jest to bug Dekompilator, jeśli spojrzeć na java.lang.reflect.Modifier src was zobaczyć, że transient i varargs mają taką samą wartość

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

na polu 0x00000080 oznacza transient, dla metody (danym przypadku) oznacza, że ​​varargs. W ten sposób getObject wygląda w java.util.Locale src

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

W .class (kodu binarnego) varargs jest reprezentowany przez obiekt [] jako ostatni parametr + modyfikatora bit 7 = 1 (0x80). Domyślam się, że dekompilator jest stary i po prostu nie wie o varargs, który jest od wersji 1.5, więc wydrukował go jako transient.

0

To musi być błąd. Lub jakąś błędną wersję? transient jest stosowany tylko w zmiennych. Czy możesz podać link tam, gdzie to widzisz?

1

dokumentacja Java stwierdza, że ​​przemijające kluczowe jest stosowana tylko do zmiennych instancji więc to doesnt sensu

3

transient może być stosowana tylko do zmiennych składowych, a nie metody, więc nie jest to problem tutaj.

Przeglądanie nazw zmiennych w kodzie - takie jak String s i Object[] aboj - wygląda na to, że to źródło zostało wygenerowane przez dekompilowanie odpowiedniego pliku .class.

Wydaje mi się, że jest jakiś błąd w używanym dekompilatorze, który błędnie dodaje transisent do deklaracji metody.

6

Jeśli ten kod został dekompilowana jest najprawdopodobniej wynikiem tego: Why Java methods with varargs identified as transient?

cytuję stamtąd:

Sortowanie odpowiedź można znaleźć w kodeksie javassist AccessFlag

public static final int TRANSIENT = 0x0080; public static final int VARARGS = 0x0080; Wygląda na to, że obie mają te same wartości. I od przejściowy oznacza nic dla metod, podczas gdy varargs nic nie znaczy dla pól , jest w porządku, aby były takie same.