3

Object getAttr(String name)すべての属性アクセス試行を受け取るような「ディスパッチャ」関数を含むようなオブジェクトを Java で作成したいのでSystem.out.print(myObj.hello)、実際のコードは のようなものに変換されSystem.out.print(myObj.getAttr('hello'))ますmyObj.hello = 123。として実行しmyObj.setAttr('hello', 123)ます。任意の属性名を使用できるはずであることに注意してください。可能な名前のリストは事前にわかりません。

では、この場合、それは可能なのでしょうか?

UPD#1:私は JVM 用の新しい言語 (どういうわけか (J|P)ython のようなものなので、Jython と呼びましょう) を作成しており、非常に緊密な Java 統合を意図しています。必要な設計機能の 1 つは、単に入力するだけで Java コードから Jython オブジェクト属性にシームレスにアクセスできる機能ですjythonObject.some_attribute。これが取引です。

終了: AspectJ を介して AOP を使用することが、これに対する唯一の可能な解決策のようです。そのため、助けてくれた皆さん、特に Thomas に最も広範な回答をありがとう:)

4

5 に答える 5

3

次の方法を除いて、純粋な Java を使用することはできません。

バイトコード操作

たとえば、AspectJ を使用します。

注釈プロセッサ

カスタム アノテーション プロセッサを使用します。これは、実際には一種のバイトコード操作でもあります。Projekt Lombokはこのようなことを行っています。

合成アクセサー メソッド

つまり、コードが合成アクセサー メソッドを使用している場合 (この場合、理論上はプロキシを作成できます):

public class Test {
    public static void main(String... args) {
        TestClass t = new TestClass();
        // this is actually calling a synthetic accessor method
        t.hello = "x";
    }
    static class TestClass {
        private String hello;
    }
}
于 2011-06-06T15:43:14.540 に答える
2

厳密に OOP の理由にとどまる場合、フィールドは外部からまったくアクセスできないようにする必要があります。すべてのフィールド アクセスは、get/set メソッドを介して行う必要があります。

また、動的プロキシを介してインターフェイスのメソッドをインターセプトすることもできます。(重要な注意: クラスではできません。インターフェースのみです。)

これがニーズに合わない場合 (ただし、サード パーティ製のツールを作成している場合を除き、おそらくそうすべきです)、厄介な方法、アスペクト指向プログラミング、または単純なバイトコード ハッキングしかありません。

ただし、これを行う必要があることを知っていれば役立ちます。

于 2011-06-06T15:49:53.260 に答える
1

AspectJ (http://www.eclipse.org/aspectj/) または別の AOP ライブラリを使用する必要があります。

于 2011-06-06T15:31:45.380 に答える
0

アスペクト指向プログラミング (AOP) を確認してください。

于 2011-06-06T15:31:18.503 に答える