使用AOP我知道使用java 8和切入点现在可以通过AOP获取方法方法参数的名称。
我的问题是,是否也可以获取要返回的对象的名称?
更新 - 添加代码示例:
我试图记录从方法
返回的对象的名称 /**
* Log the return value of all methods in the package service.impl
* @param pjp
* @param returnValue
*/
@AfterReturning(pointcut = "execution(public * com.bla.core.service.impl.*.*(..))", returning = "returnValue")
public void debugAfter(JoinPoint pjp, Object returnValue) {
if (logger.isDebugEnabled()) {
logger.debug(getAuditEndMessage(pjp, returnValue));
}
}
private String getAuditEndMessage(JoinPoint joinPoint, Object returnValue) {
String methodName = joinPoint.getSignature().getName();
String className = joinPoint.getTarget().getClass().getSimpleName();
//Assuming every object has the toString method overriden
//In reality there is more logic than this
String returnValueStr = String.valueOf(returnValue);
String returnValueObjectName = //Trying to find some way of finding this value
//Ex: "[End][CategoryServiceImpl][getCategory]Ouput: [category=[id=1][name=Test Category][description=Test Description]]
String returnStr = "[End][" + className + "][" + methodName + "]Ouput: [" + returnValueObjectName + "=" + returnValueStr + "]"
return returnStr;
}
所以,如果我有一个方法:
public ExampleCategory getCategory(int categoryId){
ExampleCategory category = exampleCategoryDao.read(categoryId);
return category;
}
我希望输出字符串包含要返回的对象的名称:
[End] [CategoryServiceImpl] [getCategory]输出:[类别 = [id = 1] [名称=测试类别] [描述=测试说明]]
我可以使用新的java 8功能获取输入参数的名称,但我不知道如何使用返回值执行此操作。
更新2:
在输入这一切之后,我意识到如果可能的话,也可能会出现奇怪的情况:
public ExampleCategory getCategory(int categoryId){
return exampleCategoryDao.read(categoryId);
}
我可以在这些情况下打印返回的类名。我仍然想知道是否可以做我上面提到的问题。
答案 0 :(得分:0)
正如我在that answer中已经说过的,AspectJ不了解局部变量,只知道非静态或静态成员变量。所以你的问题的答案是否定的。
即使这是可能的,我也不认为知道局部变量名称有任何附加价值。在那里,你远远超出了AOP的概念(实现横切关注点),而是在调试器的范围内。此外,本地变量(甚至术语本身!)的概念也与其本地有关。除了方法之外,它们不是一个类的合同的一部分,而是完全在其实现的内部。
顺便说一下,建议名称@AfterReturning
是一个暗示其目的:获取一些信息并在方法返回结果后执行操作。您想在返回结果之前知道一些内部方法状态。