一、前言
注解(也称为元数据)为我们在代码中添加信息提供了一种方法,它在 一定程度上将元数据与源代码文件结合在一起。它是从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
大家可以自己执行代码,看看结果。
----------------------------------------------------------------------
努力到无能为力,奋斗到感动上天!