Java 中如何自定义注解?
1,608 total views, 3 views today
注解的概念可以参考文章 Java 中的注解有哪些?如何自定义注解?
下面举个例子,看下如何自定义注解。
例子很简单,使用@interface,定义记日志的注解,通过反射读取这个注解,如果函数有标记这个注解,那么调用这个函数的时候,需要打印日志。
这里需要注意的是,调用函数就不能直接掉,而是必须通过一个代理类去调用,在代理类中去判断函数是否有相关的标注。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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 ""; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
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
可以看到,标注了注解的方法,运行的时候,会在运行开始前打印一个日志,运行结束后再打印一个日志。
原创文章,转载请注明出处!http://www.javathings.top/java中如何自定义注解?/