Java 中如何自定义注解?
注解的概念可以参考文章 Java 中的注解有哪些?如何自定义注解?
下面举个例子,看下如何自定义注解。
例子很简单,使用@interface,定义记日志的注解,通过反射读取这个注解,如果函数有标记这个注解,那么调用这个函数的时候,需要打印日志。
这里需要注意的是,调用函数就不能直接掉,而是必须通过一个代理类去调用,在代理类中去判断函数是否有相关的标注。
注解的定义
package top.javathings.demo;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface WiriteLog {
String name() default "";
}
注解
复制
注解的使用
package top.javathings.demo;
import java.lang.reflect.Method;
public class App {
public static void main(String[] args) throws Exception {
LogicInvoker.Invoke("work1", Logic.class);
LogicInvoker.Invoke("work2", Logic.class);
}
}
/*
* 代理类
* */
class LogicInvoker {
public static void Invoke(String funcName, Class<?> T) throws Exception {
Method m1 = T.getDeclaredMethod(funcName);
WiriteLog annotion = m1.getAnnotation(WiriteLog.class);
Object obj = T.newInstance();
if (annotion != null) {
System.out.println(annotion.name() + " begin");
m1.invoke(obj);
System.out.println(annotion.name() + " end");
} else {
m1.invoke(obj);
}
}
}
class Logic {
@WiriteLog(name = "work1")
public void work1() {
System.out.println("work1 working");
}
@SuppressWarnings(value = { })
public void work2() {
System.out.println("work2 working");
}
}
复制
运行结果:
work1 begin
work1 working
work1 end
work2 working
可以看到,标注了注解的方法,运行的时候,会在运行开始前打印一个日志,运行结束后再打印一个日志。