我是AspectJ的新手,我尝试这样做:
假设我有两个对象:var_obj1
、var_obj2
。
它们属于同一类型:MyObject
。
在我的方面,我在MyObject
上使用关于toString()
方法的around()
建议。我想返回对象变量名
例如,如果我在var_obj1
上调用toString()
,这个方法(在方面)应该返回:"hello from var_obj1"。
如果我在var_obj2
上调用toString()
,这个方法(在方面)应该返回:"hello from var_obj2"。
这应该在不将变量名保存在对象中的情况下完成。
我正在为此寻找一个AspectJ解决方案。
我当前的代码:
public static void main(String[] args) {
MyObject var_obj1, var_obj2;
var_obj1 = new MyObject();
var_obj2 = new MyObject();
System.out.println(var_obj1.toString());
System.out.println(var_obj2.toString());
}
方面:
String around(): execution(String com.example.shapes.MyObject.toString()) {
var object_var_name = ""; // here we need to put the variable object name
return "hello from "+object_var_name;
}
您想要实现的是使用AspectJ是不可能的。首先,因为没有切入点表达式来挑选方法执行(或者更确切地说,方法调用)基于访问局部变量的连接点。除此之外,您不应该基于局部变量的命名甚至使用来构建应用程序逻辑,可以在根本不使用局部变量的情况下调用方法。考虑以下示例:
new MyObject().toString();
someOtherObject.getMyObject().toString();
这两个调用都是完全有效的toString()
,但没有使用局部变量。