一、前言

注解(也称为元数据)为我们在代码中添加信息提供了一种方法,它在 一定程度上将元数据与源代码文件结合在一起。它是从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 }

java 注解字段为空则设置成null_java 注解字段为空则设置成null

java 注解字段为空则设置成null_字节码_02

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

java 注解字段为空则设置成null_java 注解字段为空则设置成null

java 注解字段为空则设置成null_字节码_02

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

大家可以自己执行代码,看看结果。

 

----------------------------------------------------------------------

 

努力到无能为力,奋斗到感动上天!