2017-01-12 20 views
0

Использование AOP Я знаю, используя java 8 и pointcut, теперь можно получить имена параметров метода методов через AOP.Получить имя объекта ответа через AOP

Мой вопрос: возможно ли получить имя возвращаемого объекта?

Update - Добавление кода Пример:

Я пытаюсь войти имя объекта возвращается из метода

/** 
    * 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; 
    } 

Я хочу, чтобы строка вывода содержала имя возвращаемого объекта:

[Конец] [CategoryServiceImpl] [getCategory] Ouput: [категория = [ID = 1] [имя = Test Category] [Описание = Тест Описание]]

я могу получить имена входных параметров с новая функциональность java 8, но я не знаю, как это сделать с возвращаемым значением.

Update 2:

После ввода все это, я понял, что, если это возможно, также может быть странные случаи, как:

public ExampleCategory getCategory(int categoryId){ 
     return exampleCategoryDao.read(categoryId); 
    } 

Я мог бы просто напечатать возвращающееся имя класса в этих случаях. Я все равно хотел бы знать, можно ли делать то, о чем я прошу.

+1

(Возвращенные) объекты не имеют имен, только члены класса или локальные переменные. Что такое ваш прецедент? Пожалуйста, покажите код и опишите, чего вы действительно хотите достичь и почему. – kriegaex

+0

Объекты не имеют имен. Неясно, что вы спрашиваете. – EJP

+0

Я думаю, что эта идея, может быть, слишком сложна. Почему бы просто не пощелкать метод 'toString()' в возвращаемой переменной и использовать это в журнале аудита? – Brad

ответ

0

Как я уже говорил в that answer, AspectJ не знает о локальных переменных, только о нестатических или статических переменных-членах. Поэтому ответ на ваш вопрос - нет.

Даже если это было возможно, я не вижу никакой дополнительной информации в знании локальных имен переменных. Там вы далеко за пределами концепции АОП (реализующей сквозные проблемы) и, скорее, в рамках отладчика. Кроме того, само понятие местных переменных (и даже сам термин!) Относится к их локальности. Помимо методов они не являются частью контракта класса, но полностью внутренне его реализации.

Кстати, имя совета @AfterReturning является намеком на его цель: получить некоторую информацию и сделать что-то после метод вернули свой результат. Вы хотите знать некоторое внутреннее состояние метода перед тем, как он вернет результат.