自定义注解实现打印日志功能

在Java开发中,我们经常需要在代码中添加日志功能来方便调试和追踪问题。本文将介绍如何通过自定义注解的方式实现在方法执行前后打印日志的功能。

实际问题

在开发过程中,有时候我们需要在某些方法执行前后输出日志,以便于调试或者监控。但是在每个方法中手动添加日志输出的代码会让代码变得臃肿,影响代码的可读性和维护性。因此,我们可以通过自定义注解的方式来简化这个过程。

解决方案

我们可以定义一个注解@Log,并在需要打印日志的方法上添加该注解。在方法执行前后分别输出日志信息。下面我们通过一个示例来演示具体实现。

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Log {
}

public class LogAspect {
    public Object logMethod(Method method) {
        System.out.println("Before method: " + method.getName());
        Object result = null;
        try {
            result = method.invoke(null);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("After method: " + method.getName());
        return result;
    }
}

public class Main {
    @Log
    static void test() {
        System.out.println("test method executed");
    }

    public static void main(String[] args) {
        Method[] methods = Main.class.getDeclaredMethods();
        LogAspect logAspect = new LogAspect();
        for (Method method : methods) {
            if (method.isAnnotationPresent(Log.class)) {
                logAspect.logMethod(method);
            }
        }
    }
}

在上面的示例中,我们定义了一个@Log注解,并在test方法上添加了该注解。在Main类的main方法中,我们遍历所有方法,对标记了@Log注解的方法调用LogAspect中的logMethod方法,在方法执行前后打印日志。

序列图

下面是一个简单的序列图,展示了Main类调用test方法时的执行过程。

sequenceDiagram
    participant Main
    participant test
    participant LogAspect
    Main ->> LogAspect: logMethod(test)
    LogAspect ->> test: Before method
    test -->> LogAspect: test method executed
    LogAspect ->> test: After method

饼状图

下面是一个简单的饼状图,展示了方法执行前后的时间分配比例。

pie
    title Method Execution Time
    "Before Method" : 30
    "Method Execution" : 60
    "After Method" : 10

通过自定义注解实现打印日志的功能,可以简化代码中的日志输出操作,提高代码的可读性和维护性。同时,这种方式也更加灵活,方便扩展和定制化。希望本文对你有所帮助。