2012-01-02 17 views
4

anonySubClassMethodメソッドにアクセスする方法はありますか? Javaコンパイラがこのメソッドを作成できる理由がない場合は、フランシス・アプトンから匿名クラスメソッドへのアクセス

abstract interface AnonyIfc { 
    public abstract void methodIfc(); 
} 

public class AnonyImplementation { 
    public static void main (String... a) { 
     AnonyIfc obj = new AnonyIfc(){ 
     public void methodIfc() { 
      System.out.println("methodIfc"); 
     } 
     public void anonySubClassMethod() { 
      System.out.println("anonySubClassMethod"); 
     } 
     }; 
     //obj.anonySubClassMethod() won't be visible since refering sub class 
     //       method with super class reference 
    } 
} 

更新
私はanonySubClassMethodが匿名クラス内で使用することができることを理解。だから私はJavaコンパイラがanonySubClassMethodのためのプライベートにアクセス指定子を制限することを期待することができますか?この公式の指定者にも理由があることを願っています。ちょっと興味があるんだけど。

+1

インターフェイス内のインターフェイスとメソッドは、デフォルトでは***抽象的な***なので、これらのキーワードを使用する意味はありません。あなたはいつもそれを避けることができます。 – Lion

答えて

2

このメソッドは、匿名クラス内から呼び出すことができます。また、この構造のより典型的な使用法は、(例えばGUIリスナー用の)インターフェースを実装する場合です。そのため、メソッドは呼び出し側が予期しているインターフェースの実装であることから知られています。

+0

ありがとうございます。だから、私はanonySubClassMethodのためのアクセス修飾子を制限するコンパイラがプライベートだけであると期待することができますか? –

+1

いいえ、オブジェクトが使用されているインタフェースを実装している場合、そのメソッドはパブリックである必要があります。これは、私の答えで述べたように、通常のケースです。クラスに定義されていないためにメソッドを呼び出せないという事実は、可視性とは何の関係もありません。呼び出し元には分かっていないからです。生成されたコードを見ると、$ n接尾辞を持つ別のクラスが実際に作成されます。 –

5

アクセスにはリフレクションを使用できますが、それ以外の場合は匿名クラス以外のコードからアクセスする方法はありません。しかし、それはあなたが以内にそれにアクセスすることができなかったことを意味するものではありません。 methodIfc()はそれを呼び出すことができます。そのため、コンパイラはデッドコードであると簡単に宣言できません。

+0

リフレクションは、インターフェイス/スーパークラスで定義されていない匿名クラスのパブリックメソッドを許可する言語に意味がある理由も説明します。 –

+0

@Ernest、Reflectionはこれにアクセスする唯一の方法ではありません。ポールの答えを見てください。 – Pacerier

+0

@Pacerier - あなたは実際にこの回答を*読みましたか?特に、2番目と3番目の文章は? –

9

他の人が指摘したように、このメソッドはクラス内から呼び出すことができます。 (リフレクションを使用した以外に)クラスの外からそれを呼び出すための唯一の方法は、以下のようになる:

new Object() { 
    void doSomething() { 
     //code 
    } 
}.doSomething(); 
+0

ありがとうございます。新しい学習:) –

2

コンパイラはプライベートにanonySubClassMethodの可視性を制限するものではありません。理由は、この方法がによってアクセスすることができるということですリフレクションの手段: obj.getClass().getMethod("anonySubClassMethod").invoke(obj)

リフレクションを使用しない場合は、このメソッドを呼び出す方法はありません。

+0

反射を使用しない方法があります。ポールの答えを見てください。 – Pacerier

関連する問題