天天看點

Java 中如何自定義注解?Java 中如何自定義注解?

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

可以看到,标注了注解的方法,運作的時候,會在運作開始前列印一個日志,運作結束後再列印一個日志。