2013-04-26 9 views
24

In una classe java java.util.Locale, trovo che la parola chiave transiente abbia contrassegnato un metodo.Le parole chiave transitorie possono contrassegnare un metodo?

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

Qualcuno può dirmi perché può essere?

+0

@ user85121 puoi fornire il link dove lo vedi? – Eugene

+1

Ho controllato la sorgente jdk 1.6 e non ha la parola chiave 'transient' – sanbhat

+4

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

risposta

43

No, non è possibile, è valido solo per i campi. Sembra che tu abbia ottenuto la tua fonte da .class decompilando. Questo è il bug decompilatore, se si dà un'occhiata a java.lang.reflect.Modifier src, si vedrà che transient e varargs hanno lo stesso valore

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

per un campo 0x00000080 significa transient, per un metodo (il tuo caso) significa varargs. Questo è il modo getObject assomiglia a java.util.Locale src

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

In .class (bytecode) varargs è rappresentato da Object [] come l'ultimo bit di modifica parametro + 7 = 1 (0x80). Immagino che il decompilatore sia vecchio e semplicemente non conosca lo varargs, che è da quando Java 1.5 lo ha stampato come transient.

0

Questo deve essere un bug. O qualche revisione bacata? il transitorio si applica solo alle variabili. Puoi fornire un link dove lo vedi?

1

documentazione Java afferma che parola chiave transitoria si applica solo alle variabili di istanza in modo da questo non rende alcun senso

3

transient può essere applicato solo alle variabili membro e non ai metodi per cui v'è un problema qui.

Osservando i nomi delle variabili nel codice, ad esempio String s e Object[] aboj, sembra che questa origine sia stata generata decompilando il relativo file .class.

Penso che ci sia un errore in qualsiasi decompilatore che si sta usando, aggiungendo erroneamente transisent alla dichiarazione del metodo.

6

Se questo codice è stato decompilato è molto probabile che un risultato di questo: Why Java methods with varargs identified as transient?

sto citando da lì:

Una specie di risposta può essere trovata nel codice di javassist AccessFlag

public static final int TRANSIENT = 0x0080; public static final int VARARGS = 0x0080; Sembra che entrambi abbiano gli stessi valori. E dal momento che il transitorio non significa nulla per i metodi, mentre varargs non significa nulla per i campi , è ok per loro essere uguali.

Problemi correlati