通过AOP

时间:2017-01-12 21:28:05

标签: java aop javaagents

使用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);
    }

我可以在这些情况下打印返回的类名。我仍然想知道是否可以做我上面提到的问题。

1 个答案:

答案 0 :(得分:0)

正如我在that answer中已经说过的,AspectJ不了解局部变量,只知道非静态或静态成员变量。所以你的问题的答案是否定的。

即使这是可能的,我也不认为知道局部变量名称有任何附加价值。在那里,你远远超出了AOP的概念(实现横切关注点),而是在调试器的范围内。此外,本地变量(甚至术语本身!)的概念也与其本地有关。除了方法之外,它们不是一个类的合同的一部分,而是完全在其实现的内部。

顺便说一下,建议名称@AfterReturning是一个暗示其目的:获取一些信息并在方法返回结果后执行操作。您想在返回结果之前知道一些内部方法状态。