前面了解了注解的,这次来看一下自定义注解。
自定义注解其实很简单,直接上代码:
import java.lang.annotation.Documented;import java.lang.annotation.Inherited;import java.lang.annotation.Retention;import java.lang.annotation.Target;import java.lang.annotation.ElementType;import java.lang.annotation.RetentionPolicy;@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited/* * 定义注解 Test * 注解中含有两个元素 id 和 description * description 元素 有默认值 "hello anntation" */public @interface Test { public int id(); public String description() default "hello annotation";}
根据对元注解的解释,我们知道:
- 这个注解可以用于方法
- JVM运行期间该注解都有效
- 该注解包含在 javadoc 中
- 该注解允许子类继承
下面看下通过注解我们能取到什么
public class TestMain { /* * 被注解的三个方法 */ @Test(id = 1, description = "hello methodA") public void methodA() { } @Test(id = 2) public void methodB() { } @Test(id = 3, description = "last method") public void methodC() { } /* * 解析注解,将类被注解方法 的信息打印出来 */ public static void main(String[] args) { Method[] methods = TestMain.class.getDeclaredMethods(); for (Method method : methods) { /* * 判断方法中是否有指定注解类型的注解 */ boolean hasAnnotation = method.isAnnotationPresent(Test.class); if (hasAnnotation) { /* * 根据注解类型返回方法的指定类型注解 */ Test annotation = method.getAnnotation(Test.class); System.out.println("Test( method = " + method.getName() + " , id = " + annotation.id() + " , description = " + annotation.description() + " )"); } } } }
上面的Demo打印的结果如下:
Test( method = methodA , id = 1 , description = hello methodA )Test( method = methodB , id = 2 , description = hello annotation )Test( method = methodC , id = 3 , description = last method )
上例其实也说明了,我们一般通过反射来取RUNTIME保留策略的注解信息。