2012-05-23 1 views
3

Я хочу использовать аспект для добавления getter и setter для частного поля id. Я знаю, как добавить метод через аспект, но как я могу получить доступ к частному идентификатору?AspectJ: Доступ к закрытым полям?

I thoght, что я просто должен сделать аспект установленным. Я попробовал следующий код, но этот аспект не может получить доступ к полю 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?

ответ

6

Вы уверены, что не можете? Я только что протестировал, и он побежал. Вот мой полный код:

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()); 
    } 
} 

Если по какой-то причине, что не работает для вас, вы можете использовать отражение, или другой способ, как описано здесь: http://blogs.vmware.com/vfabric/2012/04/using-aspectj-for-accessing-private-members-without-reflection.html Однако, в соответствии с критериями, оно не может быть стоило того.

+0

Спасибо. Я попробовал еще раз, и он работает. Eclipse отмечает, что строка имеет ошибку, но когда я ее запускаю, она работает нормально. Вчера я даже не пробовал, потому что доверял Eclipse. Это реально emberassing для меня ... – punkyduck

+0

Да, затмение немного напуганное с объявлениями типа Inter, а также сглаженными исключениями, но компиляция в любом случае. :-) – anjosc

+0

Я не использовал «привилегированные» ключевые слова. Спасибо за полный пример! – dieend