==== 注解的作用 ====
注解相当于对类,方法,字段等额外的说明,但又不止于此。因为注解内容可以通过反射机制获得。我们可以利用注解+反射机制将一些复杂的操作隐藏起来
注解+反射机制将一些复杂的操作隐藏起来
===== 注解 =====
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());
}