AspectJ:如何访问私有字段?

5
我希望使用一个切面(aspect)来为私有id字段添加getter和setter。我知道如何通过切面添加方法,但是我应该如何访问私有的id字段呢?
我认为只需要使切面具有特权就可以了。我尝试了以下代码,但是切面无法访问id字段。
public privileged aspect MyAspect {

public String Item.getId(){

    return this.id;
}

一种可能的方法是像这篇博客中所示,使用反射:http://blog.m1key.me/2011/05/aop-aspectj-field-access-to-inejct.html 除了使用反射外,是否有使用AspectJ实现的方法?
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());
    }
}

如果由于某种原因这种方法不能工作,您可以使用反射或参考这里的其他方式。但是根据基准测试结果,这可能不值得。


谢谢。我再试了一次,它可以工作了。Eclipse标记该行有错误,但是当我运行它时,它可以正常工作。昨天,我甚至没有尝试它,因为我相信Eclipse。这对我来说真的很尴尬... - punkyduck
是的,Eclipse在Inter Type Declarations和Softened Exceptions方面有点奇怪,但还是可以编译。 :-) - anjosc
我没有使用“特权”关键字。感谢提供完整的示例! - dieend
同样的问题在我这里也出现了(aspectj 1.7.3),AspectJ编译器报错并退出,提示this.s是未知字段。我猜你的例子只有在类和切面在同一个包甚至同一个物理切面文件中才能工作,或者它已经不再起作用了。但是使用thisJoinPoint.getThis()...可以通过接口注入的方式访问私有字段来解决这个问题。 - Andreas Covidiot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接