5

アスペクトを使用して、プライベート ID フィールドのゲッターとセッターを追加したいと考えています。アスペクトを介してメソッドを追加する方法は知っていますが、プライベート ID フィールドにアクセスするにはどうすればよいですか?

側面を特権化するしかないと思いました。次のコードを試しましたが、アスペクトが id フィールドにアクセスできません。

public privileged aspect MyAspect {

public String Item.getId(){

    return this.id;
}

次のブログ投稿に示されているように、ユーザーのリフレクションが考えられます。

リフレクションが唯一の可能性ですか、それとも AspectJ でそれを行う方法はありますか?

4

1 に答える 1

8

できませんか?テストしたところ、実行されました。これが私の完全なコードです:

package com.example;

public class ClassWithPrivate {
    private String s = "myStr";
}

==========

package com.example.aspect;

import com.example.ClassWithPrivate;

privileged public aspect AccessPrivate {

    public String ClassWithPrivate.getS() {
        return this.s;
    }

    public void ClassWithPrivate.setS(String str) {
        this.s = str;
    }
}

==========

package com.example;

public class TestPrivate {

    public static void main(String[] args) {

        ClassWithPrivate test = new ClassWithPrivate();
        System.out.println(test.getS());
        test.setS("hello");
        System.out.println(test.getS());
    }
}

何らかの理由でそれがうまくいかない場合は、リフレクション、またはここで説明されている別の方法を使用できます: https ://web.archive.org/web/20161215045930/http://blogs.vmware.com/vfabric/ 2012/04 / using-aspectj-for-accessing-private-members-without-reflection.html ただし、ベンチマークによると、それだけの価値はない可能性があります。

于 2012-05-24T14:27:30.323 に答える