-3

ここでは newBTN の Action Listener をクラス B に登録したいと思います。

注:: newBTN は追加されず、初期化されません。また、クラス A は私の管理外であり、変更できません。

class A {
    private JButton newBTN = null;
}

クラス A の newBTN にアクセスして、クラス B から newBTN のアクション リスナーを登録するにはどうすればよいですか?

class B {
}
4

2 に答える 2

2

リフレクションを使用すると、既存のクラスのフィールドにアクセスできます。

警告: これは非常に悪い習慣であり、この方法に着手する前に、考えられるすべての手段を検討する必要があります。これにより、アクセスしているクラスの機能が著しく損なわれる可能性があります。「なぜこのフィールドがプライベートなのか?」と自問する必要があります。

public class TestReflection {

    public static void main(String[] args) {
        new TestReflection();
    }

    public TestReflection() {

        PrivateAccessOnly instance = new PrivateAccessOnly();

        try {
            Field field = PrivateAccessOnly.class.getDeclaredField("field");
            field.setAccessible(true);
            System.out.println("Current value = " + field.get(instance));
            field.set(instance, new JButton("Testing"));
            System.out.println("New value = " + field.get(instance));
        } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException exp) {
            exp.printStackTrace();
        }

    }

    public class PrivateAccessOnly {

        private JButton field;

    }
}
于 2013-01-30T08:54:48.983 に答える
0

考慮しなければならないことがたくさんあります。

  1. クラス A のインスタンスはクラス B からアクセスできる必要があり、またはクラス B のインスタンスはクラス A のインスタンスを作成できる必要があります。
  2. クラス A にボタンのインスタンスを作成します。
  3. A のボタンのインスタンスを返すクラス A に「getter」メソッドを記述します (ここで、この前にステップ 2 を完了する必要があることを思い出してください。クラス A にボタンのインスタンスを作成しない場合、getter メソッドから null が返されます。 NullPointerException が発生します)。
  4. クラス B のインスタンスからこの getter メソッドを呼び出します。
  5. getter メソッドによって返されるボタン オブジェクトにアクション リスナーを追加します。
于 2013-01-30T08:39:18.647 に答える