一、前言
注解(也称为元数据)为我们在代码中添加信息提供了一种方法,它在 一定程度上将元数据与源代码文件结合在一起。它是从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
@Documented
@Inherited
@Target({ ElementType.FIELD, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface Init
{
public String value() default "";
}
public class User
{
private String name;
private String age;
public String getName()
{
return name;
}
@Init(value = "lee")
public void setName(String name)
{
this.name = name;
}
public String getAge()
{
return age;
}
@Init(value = "66")
public void setAge(String age)
{
this.age = age;
}
}
public class UserFactory
{
public static User create()
{
User user = new User(); // 获取User类中所有的方法(getDeclaredMethods也行)
Method[] methods = User.class.getMethods(); try
{
for (Method method : methods)
{
// 如果此方法有注解,就把注解里面的数据赋值到user对象
if (method.isAnnotationPresent(Init.class))
{
Init init = method.getAnnotation(Init.class);
method.invoke(user, init.value());
}
}
}
catch (Exception e)
{
e.printStackTrace();
return null;
} return user;
}
}
public class Test
{
public static void main(String[] args) throws IllegalAccessException,
IllegalArgumentException, InvocationTargetException
{
User user = UserFactory.create(); System.out.println(user.getName());
System.out.println(user.getAge());
}
}
大家可以自己执行代码,看看结果。
参考文章:
《Thinking in Java》
https://www.cnblogs.com/liangweiping/p/3837332.html
----------------------------------------------------------------------