2015-10-01 2 views
2

У меня есть аннотация вроде этого:как получить Аннотированный объект с помощью AspectJ

@Inherited 
@Documented 
@Target(value={ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Restful { 

} 

Я аннотированный этот класс так:

@Restful 
public class TestAspect { 
    public String yes; 
} 

У меня есть срез точек, как это:

@Pointcut("@annotation(com.rest.config.Restful)") 
    public void pointCutMethod() { 
} 

Я пробовал:

@Before("pointCutMethod()") 
public void beforeClass(JoinPoint joinPoint) { 
    System.out.println("@Restful DONE"); 
    System.out.println(joinPoint.getThis()); 
} 

Но getThis() возвращает null.

В основном я пытаюсь получить экземпляр объекта TestAspect. Как мне это сделать? Любая подсказка? Любая помощь могла бы быть полезна.

Заранее спасибо

ответ

1

С аннотацией, размещенной на типе только и срезе точек @annotation(com.rest.config.Restful) вы только собираетесь соответствовать статической инициализации точки соединения для вашего типа. Как мы можем видеть, если вы используете -showWeaveInfo при компиляции (я хлопнул ваши образцы кода в файл с именем Demo.java):

Join point 'staticinitialization(void TestAspect.<clinit>())' in 
    Type 'TestAspect' (Demo.java:9) advised by before advice from 'X' (Demo.java:19) 

Когда статический инициализатор работает не this, следовательно, вы получите нуль при извлечении это от thisJoinPoint. Вы не сказали, что вы на самом деле хотите посоветовать, но позвольте мне предположить, что это создание нового экземпляра TestAspect. Ваш срез точки должны соответствовать по исполнению конструктора для данного типа аннотированного:

// Execution of a constructor on a type annotated by @Restful 
@Pointcut("execution((@Restful *).new(..))") 
public void pointcutMethod() { } 

Если вы хотите, чтобы соответствовать методам этого типа, это было бы что-то вроде:

@Pointcut("execution(* (@Restful *).*(..))") 
+0

Спасибо @Andy Климента, но, как вы можете увидеть, я пытаюсь получить экземпляр, созданный в среде java ee (подсказка: java ee 6 - один из тегов), новый в исполнении не будет работать. однако он будет работать в среде. любая подсказка о том, как это сделать в среде ee 6/7? – Ikthiander

Смежные вопросы