2013-04-26 7 views
24

In einer Java-Klasse java.util.Locale finde ich, dass das Schlüsselwort Transient eine Methode markiert.Können vorübergehende Schlüsselwörter eine Methode markieren?

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

Kann mir jemand sagen, warum kann das sein?

+0

@ user85121 können Sie den Link, wo Sie das sehen? – Eugene

+1

Ich überprüfte jdk 1.6 source und es hat nicht 'transient' Schlüsselwort – sanbhat

+4

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

Antwort

43

Nein, es kann nicht, es ist nur gültig für Felder. Sie scheinen Ihre Quelle von .class durch Dekompilierung zu bekommen. Dies ist der Decompiler Fehler, wenn Sie einen Blick auf java.lang.reflect.Modifier src nehmen Sie werden sehen, dass transient und varargs den gleichen Wert

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

für ein Feld haben 0x00000080 bedeutet transient, für ein Verfahren (Ihr Fall) bedeutet varargs. Dies ist, wie getObject sieht aus wie in java.util.Locale src

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

In .class- (Bytecode) varargs wird durch Objekt dargestellt [] als letzter Parameter + Modifikator Bit 7 = 1 (0x80). Ich denke, der Decompiler ist alt und weiß einfach nichts über varargs, was seit Java 1.5 ist, so dass es als transient ausgedruckt wurde.

0

Dies muss ein Fehler sein. Oder eine Buggy-Revision? Transient wird nur auf Variablen angewendet. Können Sie einen Link angeben, wo Sie das sehen?

1

Java Dokumentation besagt, dass transiente Schlüsselwort nur auf Instanzvariablen angelegt wird, so Dies hat keinen Sinn machen

3

transient kann nur auf Membervariablen und nicht auf Verfahren angewendet werden, so dass es hier ein Problem ist.

Mit Blick auf die Variablennamen in Ihrem Code - Dinge wie String s und Object[] aboj - es sieht aus wie diese Quelle wurde durch Dekompilierung der relevanten .class Datei generiert.

Ich glaube, es gibt einen Fehler in dem verwendeten Decompiler, der versehentlich transisent zur Methodendeklaration hinzufügt.

6

Wenn dieser Code dekompiliert wird es höchstwahrscheinlich eine Folge davon ist: Why Java methods with varargs identified as transient?

ich zitiere mich von dort:

Sortieren einer Antwort kann im Code von Javassist AccessFlag findet

public statisch final int TRANSIENT = 0x0080; public static final int VARARGS = 0x0080; Es scheint, dass beide die gleichen Werte haben. Und da Transient bedeutet nichts für Methoden, während Varargs nichts für Felder bedeutet, ist es in Ordnung für sie, die gleichen zu sein.

Verwandte Themen