2017-12-04 60 views
2

このJava Tutorialに記載されているように、ブリッジメソッドは合成メソッドでもあることを意味します。問題は、isSyntheticメソッドの呼び出しがtrueを返す可能性がありますが、Methodオブジェクトの場合はisBridgeメソッドがfalseを返します。つまり、メソッドが合成の場合は、それもブリッジメソッドであることを暗示しますか?Java合成方法とブリッジメソッドの混同

それはまったく同じではありませんが、isSyntheticisBridgeメソッドのソースコードは以下のようになります。

static final int SYNTHETIC = 0x00001000; 
public boolean isSynthetic() { 
    return (getModifiers() & SYNTHETIC) != 0; 
} 

static final int BRIDGE = 0x00000040; 
public boolean isBridge() { 
    return (getModifiers() & BRIDGE) != 0; 
} 

isBridgeメソッド本体がreturn isSynthetic();のようではないのはなぜ?

+0

これら:

Function<String, Integer> func = s -> s.length(); Arrays.stream(DeleteMe.class.getDeclaredMethods()) .peek(m -> System.out.println(m.getName() + " isSynth : " + m.isSynthetic() + " isBridge : " + m.isBridge())) .forEach(System.out::println); 

のようなエントリがありますメソッドは対応する値を返すだけです修飾子を付ける。おそらくクラスは単なるデータ所有者です。重要なのは、修飾子の設定方法の論理です。 –

+0

私は同じ考えをしていました。修飾子はコンストラクタによって設定されます。しかし、私はそれの用法を見つけることができません。 –

答えて

2

あなたは、単に、そのような例を探している場合:

lambda$0 isSynth : true isBridge : false 
lambda$1 isSynth : true isBridge : false 
+2

もう一つの例は、内部クラスが外部クラスの 'private'メンバにアクセスし、その逆の場合に生成される' access $ n'メソッドです。 – Holger

+0

@Holgerはこれらのことを考えなかった:) – Eugene

0

ブリッジは合成ですが、合成ブリッジは必ずしもブリッジではありません。例:

public class Test { 

    public Test clone() { 
     return null; 
    } 

バイトコードの概要:

// access flags 0x1041 
    public synthetic bridge clone()Ljava/lang/Object; throws java/lang/CloneNotSupportedException 
    L0 
... 
+0

私はあなたのTestクラスでgetDeclaredMethods()を呼び出すことによって2つのクローンメソッドを取得します。それらの1つは、合成とブリッジの両方です。 –

+0

Object戻り値の型を持つclone()は、Object.clone()をオーバーライドするためにコンパイラによって作成されるブリッジメソッドです。コンパイラによって作成される暗黙のメソッドはすべて合成型ですが、異なる目的のために作成されます。 –

+1

私は合成物が何であるかを知っています。あなたの答えには明確化が必要であることを指摘したいだけでした。あなたが与えたものはあなたの結論を明確にするのに十分ではありません。 –

関連する問題