6

これは奇妙です。次のコードがあります。

class A
{   
    protected A clone() throws CloneNotSupportedException
    {
        return (A) super.clone();       
    }
}

「showmycode.com」でそのバイトコードを逆コンパイルすると、次のコードが表示されました。

class A
{

    A()
    {
    }

    protected A clone()
    throws clonenotsupportedexception
    {
        return (A)super.clone();
    }

    protected volatile object clone()
    throws clonenotsupportedexception
    {
        return clone();
    }
}

2番目の「クローン」メソッドでメソッドの戻り値の型が揮発性になるとはどういう意味ですか? (このコードは、Eclipse のデフォルトの JDK 1.6 コンパイラでコンパイルされています)。

4

4 に答える 4

8

この回答は、Java でメソッドを揮発性にするのはなぜですか? という質問で既に説明されています。 しかし、ここにいくつかの追加情報があります。

メソッド (おそらくスーパークラスのジェネリック メソッドのみ) をオーバーロードすると、そのメソッドは「ブリッジ メソッド」としてマークされます。からjava.lang.reflect.Modifier:

static final int BRIDGE    = 0x00000040;

残念ながら、これはフィールドが であるとマークするために使用されるのと同じビットですvolatile

public static final int VOLATILE         = 0x00000040;

そのメソッドの修飾子を出力すると、次のように表示されます。

public volatile

Modifiers.toString(int)これは、フィールドなのかメソッドなのかわからないメソッドの制限です。

public static String toString(int mod) {
    StringBuffer sb = new StringBuffer();
    ...
    if ((mod & VOLATILE) != 0)  sb.append("volatile ");
    // no mention of BRIDGE here
    ...
    return sb.toString().substring(0, len-1);
}
于 2014-01-13T22:15:21.783 に答える
4

フィールドとメソッドの修飾マスクは似ていますが、まったく同じではありません。toString逆コンパイラは、ここでメソッドを使用している可能性が最も高いです

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/reflect/Modifier.java

しかし、それがしないのは、すべてのビットを処理することです

// Bits not (yet) exposed in the public API either because they
// have different meanings for fields and methods and there is no
// way to distinguish between the two in this class, or because
// they are not Java programming language keywords

それが処理しないのは、コンパイラが生成したコードを意味syntheticし、bridge識別するビットです。

ここで何かを意味する場合volatileは、メソッドが何も実行しない場合でも、メソッドを削除しないことを意味する可能性があります。

于 2012-04-29T08:21:10.330 に答える
4

それは何の意味もありません。逆コンパイラのバグです。話の終わり。

(このバグはおそらく、クラス ファイル形式で使用される特定のフラグ ビットが「オーバーロード」されているという事実に関連している可能性があります。これは、クラス、フィールド、またはメソッドのコンテキストで異なることを意味します。また、いくつかの「新しい使用法」があったこともぼんやりと思い出します。 " 最近の JVM 仕様のリビジョン。)

于 2012-04-29T06:38:48.087 に答える
1

これは逆コンパイラのバグです。

volatileフィールドの唯一の有効な修飾子です。

この記事を読むことをお勧めします。

于 2012-04-29T05:57:48.430 に答える