2013-04-26 52 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;它们看起来都具有相同的值。并且由于 瞬态对于方法没有任何意义,而可变参数对于 字段没有任何意义,所以它们可以相同。

相关问题