==== 注解的作用 ==== 注解相当于对类,方法,字段等额外的说明,但又不止于此。因为注解内容可以通过反射机制获得。我们可以利用注解+反射机制将一些复杂的操作隐藏起来 注解+反射机制将一些复杂的操作隐藏起来 ===== 注解 ===== package cc; import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) // 作用范围 // RetentionPolicy.SOURCE :只在源码级别生效 // RetentionPolicy.CLASS :在编译级别生效,主要是给编译器使用,如overwrite注解 // RetentionPolicy.RUNTIME :在运行时生效,这种方式最常用。用于在运行时改变执行方式,一般通过反射的方式获取注解,并根据注解来决定下一步如何处理 @Target({ElementType.METHOD, ElementType.TYPE}) // 注解用于哪些地方 // ElementType.TYPE :用于类、接口 // ElementType.METHOD :用于方法 // ElementType.CONSTRUCTOR :用于构造函数 // ElementType.FIELD :用于属性 @Inherited // 是否可以被继承 // 假设A是接口,且A上有注解@MyAnnoation。如果B类继承A类,那也会同时继承A类上的注解,但是A类中方法的注解无法被继承。 // 假设A是类, 且A上有注解@MyAnnoation。如果B类继承A类,B无法继承任何注解 @Documented // 是否可以导出java doc public @interface MyAnnoation { // 如果只有一个值,那默认就是value int age(); String value(); } ===== 使用注解 ===== package cc; /** * Created by fang on 16/9/27. */ @MyAnnoation(value = "class user",age=10) public class User { @MyAnnoation(value = "method1", age=11) public void show(){ System.out.println("method1"); } @MyAnnoation(value = "method2", age=12) public void show1(){ System.out.println("method2"); } } ===== 解析注解 ===== public static void main(String[] args) throws InvocationTargetException, IllegalAccessException { for(Method m:User.class.getMethods()){ for(Annotation annotation:m.getAnnotations()){ String annotationName = annotation.annotationType().getName(); if(annotationName.equals("cc.MyAnnoation")){ System.out.print("age: " + ((MyAnnoation) annotation).age()); System.out.print(", value: "+((MyAnnoation) annotation).value()); System.out.print(", MyAnnoation: "); m.invoke(new User()); } } } System.out.println(User.class.getAnnotation(MyAnnoation.class).value()); }