2013-04-26 1 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

+1

jdk 1.6のソースを調べましたが、 'transient'というキーワードはありません – sanbhat

+4

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

答えて

43

いいえ、フィールドにのみ有効です。あなたは逆コンパイルによってあなたのソースを.classから得ているようです。これは、逆コンパイラのバグです、あなたはjava.lang.reflect.Modifier SRCを見てみる場合は、transientvarargsがフィールド0x00000080ため

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

同じ値を持っていることがわかります方法(お使いの場合)のために、それはvarargsを意味し、transientを意味します。これは、getObject []はオブジェクトによって表される可変引数の.class(バイトコード)でのjava.util.Locale SRC

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

でどのように見えるかである最後のパラメータ+修飾子ビット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

のコードで見つけることができます

パブリックstatic final int TRANSIENT = 0x0080; public static final int VARARGS = 0x0080;両方とも同じ値を持っているようです。 transientはメソッドのためのものを意味しないので、varargsは フィールドのための何も意味しないので、それらが同じであることはOKです。

関連する問題