自定义注解 输出方法上的参数 和 返回值

本文介绍了如何在Java中定义一个名为`ParamLog`的自定义注解,用于记录方法参数和返回值。注解的目标元素类型包括方法和类,保留策略为运行时,便于AOP切面处理。`ParamLogUtil`类作为切面处理,通过`@Pointcut`定义注解匹配的切入点,并在`@Around`通知中获取并打印方法参数及返回值信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义自定义注解

/**

 * 参数日志

 * 输出方法上的参数

 * 输出返回对象

 */

@Target({ ElementType.METHOD, ElementType.TYPE })

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface ParamLog {

}

 

 

/**

 * 参数日志

 * 输出方法上的参数

 * 输出返回对象

 */

@Component

@Aspect

public class ParamLogUtil {

 

    private static final Logger logger  = LoggerFactory.getLogger(ParamLogUtil.class);

 

    public ParamLogUtil() {

        logger.info("加载aop模块");

    }

 

   

@Pointcut("@annotation(com.xxx.util.annotationlog.ParamLog)")

    public void methodCachePointcut() {

    }

 

    @Around("methodCachePointcut()")

    public Object around(ProceedingJoinPoint point) throws Throwable {

       

         Object[] args = point.getArgs();

         for (Object object : args) {

            logInfo(object,0);

         }

         

       

        Object object;

        try {

           object = point.proceed();

        } catch (Exception e) {

           throw e;

        }

       

       

        logInfo(object,1);

       

        return object;

    }

 

    public void logInfo(Object object, Integer i) {

        String logType = "";

        if(i == 0) {

           logType = "输入参数:";

        }else {

           logType = "输出参数:";

        }

        if(object == null) {

            logger.info(logType+"null");

         }else {

            logger.info(logType+object.toString());

         }

    }

}

 

使用自定义注解

@Override

@ParamLog

public void createXXX(XXX xxx) {

        Session session = null;

        try {

           session = getSession();

           Transaction tran = session.beginTransaction();

            session.save(xxx);

           tran.commit();

        } catch (Exception e) {

           e.printStackTrace();

        } finally {

           if (session != null) {

               session.close();

           }

        }  

}

### 自定义注解的作用与使用场景 #### Java 中的自定义注解Java 编程语言中,自定义注解是一种元数据形式的信息,用于提供程序代码的附加信息。通过自定义注解,开发者可以在编译期或运行时对特定代码片段进行标记并处理这些标记。 - **增强可读性维护性** 注解能够使代码更具表达力清晰度。例如,在方法上添加 `@Deprecated` 可以表明该方法已被废弃,提醒其他开发人员不要继续使用它[^2]。 - **自动化工具的支持** 许多框架(如 Spring Hibernate)依赖于注解来简化配置过程。例如,Spring 的 `@Autowired` 注解自动完成依赖注入操作,减少了手动编码的工作量[^3]。 - **运行时行为控制** 利用反射机制,可以通过读取注解自定义应用程序的行为。比如,基于注解实现日志记录功能或者权限校验逻辑[^4]。 以下是创建应用简单自定义注解的一个例子: ```java import java.lang.annotation.*; // 定义一个简单的注解 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyCustomAnnotation { String value(); } // 使用自定义注解 class ExampleClass { @MyCustomAnnotation("This is a custom annotation example.") public void annotatedMethod() {} } ``` --- #### Python 中的注解 尽管 Python 不像 Java 那样有严格的注解体系,但它也提供了类似的装饰器(decorator)以及函数/变量类型的提示(annotation),从而实现了某些类似于注解的功能。 - **类型标注(Type Hinting)** Python 支持为函数参数返回值指定预期的数据类型,这有助于提高代码质量并通过 IDE 提供更好的支持[^5]。例如: ```python def greet(name: str) -> str: return f"Hello, {name}!" ``` - **装饰器(Decorator Pattern)** 虽然严格意义上不叫作“注解”,但装饰器可以看做一种轻量级替代方案。它们允许你在不修改原函数的情况下扩展其功能。下面展示了一个基本的日志装饰器实例: ```python from functools import wraps def log_function_call(func): @wraps(func) def wrapper(*args, **kwargs): result = func(*args, **kwargs) print(f"{func.__name__} was called with arguments {args}, {kwargs}. Result: {result}") return result return wrapper @log_function_call def add(a, b): return a + b add(3, 4) ``` 此脚本会打印如下内容到标准输出流: ``` add was called with arguments (3, 4), {}. Result: 7 ``` --- #### 总结比较 无论是 Java 还是 Python,自定义注解都极大地增强了软件工程的能力范围——从提升源码文档化水平至促进模块间协作效率均有涉及;不过两者具体实现方式存在差异:前者倾向于声明式的强类型约束风格而后者则更偏向灵活自由的形式设计思路[^1].
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值