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

How to I pass a String and Object using Custom Annotations in Java

有没有办法通过@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;
}

注解只是'metadata',不是具体程序的一部分。 所以,如果你正在编译一个程序,元数据将不再存在。

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

我想你可以用 'Aspect-oriented programming' 解决你的问题。 这是教程 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 打印一个 'Info',其中包含类路径、方法名称、参数、结果和执行方法的执行时间。

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

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>

教程很丰富。 要弄清楚它为什么有效,请完整阅读它。

希望对你有所帮助