我尝试在我的团队代码中使用AspectJ来添加统计信息跟踪,而不会弄乱主要实现,但遇到了一些问题。我想要做的是将特定接口上的方法的所有调用都包围在我的自定义逻辑中。出于实验目的,我使用泛型将一些代码放在一起:
public interface Dummy {
public void setState(String state);
public String getState();
}
public class DummyImpl implements Dummy {
private String state;
public DummyImpl() { state = "default"; }
public void setState(String state) { this.state = state; }
public String getState() { return state; }
public static void main(String[] args) {
DummyImpl dummy = new DummyImpl();
dummy.setState("One");
dummy.setState("Another");
dummy.setState("OneMore");
System.out.printf("Current state is %s.\n", dummy.getState());
}
}
public aspect BoundDummy {
void around(Dummy d): execution(void Dummy.setState(String)) && target(d) {
String oldState = d.getState();
proceed(d);
System.err.printf("State has changed from \"%s\" to \"%s\".\n", oldState, d.getState());
}
}
这具有所需的效果,输出类似于: 目前的状态是OneMore。 国家已从"默认"到"一个"。 国家已从" One"到另一个"。 国家已从"另一个" to" OneMore"。
现在我尝试介绍泛型,这对于界面和实现是直截了当的,但是因为我不能再使用" target"并且必须使它抽象化(如果我没有得到错误:"只有抽象方面可以有类型参数"):
public interface Dummy<T> {
public void setState(T state);
public T getState();
}
public class DummyImpl<T> implements Dummy<T> {
private T state;
public DummyImpl(T state) { this.state = state; }
public void setState(T state) { this.state = state; }
public T getState() { return state; }
public static void main(String[] args) {
DummyImpl<String> dummy = new DummyImpl<String>("default");
dummy.setState("One");
dummy.setState("Another");
dummy.setState("OneMore");
System.out.printf("Current state is %s.\n", dummy.getState());
}
}
public abstract aspect BoundDummy<T> {
void around(Dummy<T> d): execution(void Dummy.setState(T)) && target(d) { // <-- doesn't compile due to erasure
T oldState = d.getState();
proceed(d);
System.err.printf("State has changed from \"%s\" to \"%s\".\n", oldState, d.getState());
}
}
我在这里干嘛?任何人都可以向我解释为了让代码在引入泛型之前按照它的方式运行,我必须改变什么?
答案 0 :(得分:0)
好吧,你可以在你的方面废除泛型。编译器会给你一个警告,但无论如何它都可以运行(我测试过):
public aspect BoundDummy {
void around(Dummy d): execution(void Dummy.setState(*)) && target(d) {
Object oldState = d.getState();
proceed(d);
System.err.printf("State has changed from \"%s\" to \"%s\".\n", oldState, d.getState());
}
}