С AspectJ вы можете легко распечатать подпись для класса, который вызывает System.out.
Ниже приведен простой пример, который будет рекомендован TraceAspect. Важной частью является то, что класс находится в демонстрационном пакете и вызывает System.out. Этот аспект также будет рекомендовать все вызовы System.out из всех классов в подпакете любой глубины демонстрационного пакета.
package demo;
public class DemoClass {
public void demo() {
System.out.println("inside demo method..");
}
public static void main(String[] args) {
new DemoClass().demo();
}
}
Чтобы распечатать пакет и имя класса до вызова System.out, вы можете добавить Aspect следующим образом:
@Aspect
public class TraceAspect {
@Pointcut("call(* java.io.PrintStream.*(..))")
public void sysoutPointcut() {
}
@Pointcut("within(demo..*)")
public void packagePointcut() {
}
@Before("sysoutPointcut() && packagePointcut()")
public void beforeSysoutCallInsideDemoPackage(JoinPoint joinPoint) {
System.out.print(joinPoint.getThis().getClass().getName() + ":"
+ joinPoint.getSourceLocation().getLine() + " - ");
}
}
Результат выполнения метода main в DemoClass:
demo.DemoClass:6 - inside demo method..
Используя Eclipse и плагин AspectJ, вы можете щелкнуть правой кнопкой мыши свой проект и выбрать Configure -> Convert to AspectJ project. Тогда код выше будет работать.
Я написал больше об AspectJ в стиле @AspectJ здесь .