如何在 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>
教程很丰富。
要弄清楚它为什么有效,请完整阅读它。
希望对你有所帮助
有没有办法通过@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>
教程很丰富。 要弄清楚它为什么有效,请完整阅读它。
希望对你有所帮助