java - 如何在 Java 中使用自定义注释传递字符串和对象

标签 java annotations

有没有办法通过@LogMethod注解传递值。我想传递一个字符串和一个对象(DataFileVO)。我该怎么做?

类似这样的事情。

@LogMethod(logLevel = LoggerOne.DEBUG, duaNum = "23L", duaDataFile = myListObject)

LoggerOne.java

public enum LoggerOne {
    INFO, DEBUG;
}

LogMethod.java

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LogMethod {
   LoggerOne logLevel() default LoggerOne.INFO;
 }

Util.java

public class Util {

public static void log(Object o, String methodName) {
    Class klass = o.getClass();

    for (Method m : klass.getMethods()) {
        if (m.getName().equals(methodName)) {
            for (Annotation a : m.getAnnotations()) {
                if (a instanceof LogMethod) {
                    LogMethod lm = (LogMethod) a;
                    switch (lm.logLevel()) {
                      case INFO:
                        System.out.println("Performing Custom INFO logging for " + m.getName());
                        break;
                      case DEBUG:
                        System.out.println("Performing Custom DEBUG logging for " + m.getName());
                    }
                }
            }
            break;
        }
    }
   }
 }

DataFileDaoImpl.java

    @LogMethod(logLevel = LoggerOne.DEBUG)
public List<DuaDataFileVO> getDuaByDuaAndShipperCode(String duaNum, Long shipperCode) {
     List<DuaDataFileVO> list = new ArrayList<DuaDataFileVO>();
     // Some code
        return list;
}

最佳答案

注释只是“元数据”,而不是具体程序的一部分。 因此,如果您正在编译一个程序,元数据将不再存在。

阅读Lesson: Annotations - ORACLE了解更多信息。

我认为你可以用“面向方面的编程”来解决你的问题。 这是教程 Java Method Logging with AOP and Annotations .

以下代码来自本教程。

重要的代码是方面:

@Aspect
public class MethodLogger {
  @Around("execution(* *(..)) && @annotation(Loggable)")
  public Object around(ProceedingJoinPoint point) {
    long start = System.currentTimeMillis();
    Object result = point.proceed();
    Logger.info(
      "#%s(%s): %s in %[msec]s",
      MethodSignature.class.cast(point.getSignature()).getMethod().getName(),
      point.getArgs(),
      result,
      System.currentTimeMillis() - start
    );
    return result;
  }
}

这个方面正在围绕一个执行(方法)进行工作 - 它具有任何修饰符、任何名称和任何参数 - 用 @Loggable 注释。 MethodLogger 打印“信息”,其中包含类路径、方法名称、参数、结果和执行方法的执行时间。

您可以像这样使用此注释:

public class Foo {
  @Loggable
  public int power(int x, int p) {
    return Math.pow(x, p);
  }
}

使用此示例输出:

[INFO] com.example.Foo #power(2, 10): 1024 in 12μs

您需要此依赖项来编译:

<dependency>
    <groupId>com.jcabi</groupId>
    <artifactId>jcabi-aspects</artifactId>
</dependency>

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
</dependency>

这个教程非常有帮助。 要了解其工作原理,请完整阅读它。

希望对你有帮助。

关于java - 如何在 Java 中使用自定义注释传递字符串和对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28218055/

相关文章:

java - 堆栈扩展 vector

java - 安卓 GCM InstanceId.getToken() -> java.io.IOException : TIMEOUT

允许 -/或 .作为日期内的分隔符

java - Hadoop索引

java - 在 Micronaut,我如何获取对象数组作为配置属性

ios - 如何处理从 Firebase 获取的数据

java - 如何强制 Apache 的 CloseableHttpClient 使用 TLSv1.2?

java - 获取包含@Size注释的字段名称及其最大长度

java - Hibernate 映射的父类(super class)关系和覆盖

android - 使用 Retrofit 在 URL 中获取带有 `&` 附加参数的请求