Ultimate AspectJ method tracing

In last post and previous one I had shown how to setup AspectJ waving. There were also sample of simple method tracing. Here goes ultimate version:

package com.sample.utils; 
import org.aspectj.lang.JoinPoint; 
import org.aspectj.lang.annotation.AfterReturning; 
import org.aspectj.lang.annotation.AfterThrowing; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Before; 
import org.aspectj.lang.reflect.MethodSignature; 
import org.slf4j.Logger; import org.slf4j.LoggerFactory; 

@Aspect 
public class MyLogger { 
    private static final Logger logger = LoggerFactory.getLogger(MyLogger.class); 
    
    public MyLogger() { } 
    
    @Before("execution(* com.klasses..*(..))") 
    public void logBefore(JoinPoint point) { 
        logger.trace(
            "Autotrace entry {}.{}({})", 
            point.getSignature().getDeclaringTypeName(), 
            point.getSignature() .getName(), 
            point.getArgs()
        ); 
    } 
    
    @AfterReturning(pointcut = "execution(* com.klasses..*(..))", returning = "result") 
    public void logAfter(JoinPoint point, Object result) { 
        boolean hasReturnValue = true; 
        
        if (point.getSignature() instanceof MethodSignature) { 
            hasReturnValue = !((MethodSignature) point.getSignature()).getReturnType().getCanonicalName().equals("void"); 
        } 
            
        if (hasReturnValue) { 
            logger.trace(
                "Autotrace exit {}.{}({}) returned {}", 
                point.getSignature().getDeclaringTypeName(), 
                point .getSignature().getName(), 
                point.getArgs(), 
                result
            ); 
        } else { 
            logger.trace(
                "Autotrace exit {}.{}({})", 
                point.getSignature().getDeclaringTypeName(), 
                point.getSignature() .getName(), 
                point.getArgs()
            ); 
        } 
    } 
    
    @AfterThrowing(pointcut = "execution(* com.klasses..*(..))", throwing = "error") 
    public void logThrow(JoinPoint point, Throwable error) { 
        logger.trace(
            "Autotrace exit {}.{}({}) throwed {}", 
            point.getSignature().getDeclaringTypeName(), 
            point .getSignature().getName(), 
            point.getArgs(), 
            error
        ); 
    } 
}
Tags:  Gradle  Java  AspectJ