一、前言
注解(也称为元数据)为我们在代码中添加信息提供了一种方法,它在 一定程度上将元数据与源代码文件结合在一起。它是从java 5 开始引入的。通过使用注解,我们可以将元数据保存在Java源代码之中,并利用annotation API为注解构造处理工具。
二、语法
●从语法的角度来看,注解的使用方式几乎与修饰符的使用一模一样。它的元素看起来就像接口的方法,唯一的区别是你可以为其指定默认值。
●注解包过三种标准注解和四种元注解,以及自定义注解。
★★★标准注解★★★
@Override:方法的覆盖
@Deprecated:弃用,表示当前api停止使用
@SuppressWarnings:关闭不当的编译器警告信息。
★★★元注解★★★
@Target:表示该注解作用于什么地方
ElementType.FIELD // 字段、枚举的常量
ElementType.METHOD // 方法
ElementType.PARAMETER) // 方法参数
ElementType.CONSTRUCTOR // 构造函数
ElementType.LOCAL_VARIABLE // 局部变量
ElementType.ANNOTATION_TYPE // 注解
ElementType.PACKAGE // 包
@Retention:保存注解信息的级别
RetentionPolicy.SOURCE // 注解仅存在于源码中,在class字节码文件中不包含
RetentionPolicy.CLASS // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得
RetentionPolicy.RUNTIME // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
@Documented:将此注解包含在Javadoc中
@Inherited:允许子类继承父类中的注解
●编译器对元素的默认值过分挑剔。也就是说,元素要么具有默认值,要么必须在使用注解时提供元素的值。其次,对于非基本类型的元素,无论在源码中声明,还是在注解接口中定义默认值,都不能以null作为其值。为了避开这个约束,可以定义一些特殊的值,如空字符串或是负数,比如(-1)等。这也是在定义注解时,一个习惯用法。
三、自定义注解demo
1 @Documented 2 @Inherited 3 @Target({ ElementType.FIELD, ElementType.METHOD }) 4 @Retention(RetentionPolicy.RUNTIME) 5 public @interface Init 6 { 7 public String value() default ""; 8 }
1 public class User 2 { 3 private String name; 4 private String age; 6 public String getName() 7 { 8 return name; 9 } 11 @Init(value = "lee") 12 public void setName(String name) 13 { 14 this.name = name; 15 } 17 public String getAge() 18 { 19 return age; 20 } 22 @Init(value = "66") 23 public void setAge(String age) 24 { 25 this.age = age; 26 } 27 }
1 public class UserFactory 2 { 3 public static User create() 4 { 5 User user = new User(); 6 7 // 获取User类中所有的方法(getDeclaredMethods也行) 8 Method[] methods = User.class.getMethods(); 9 10 try 11 { 12 for (Method method : methods) 13 { 14 // 如果此方法有注解,就把注解里面的数据赋值到user对象 15 if (method.isAnnotationPresent(Init.class)) 16 { 17 Init init = method.getAnnotation(Init.class); 18 method.invoke(user, init.value()); 19 } 20 } 21 } 22 catch (Exception e) 23 { 24 e.printStackTrace(); 25 return null; 26 } 27 28 return user; 29 } 30 }View Code
1 public class Test 2 { 3 public static void main(String[] args) throws IllegalAccessException, 4 IllegalArgumentException, InvocationTargetException 5 { 6 User user = UserFactory.create(); 7 8 System.out.println(user.getName()); 9 System.out.println(user.getAge()); 10 } 11 }View Code
大家可以自己执行代码,看看结果。
参考文章:
《Thinking in Java》
https://www.cnblogs.com/liangweiping/p/3837332.html
----------------------------------------------------------------------