注解
Annotation是从JDK5.0开始引入的新技术,注解的主要作用有:
l 对程序做出解释,基于这一点,注解和注释没什么区别;
l 可以被其他程序读取,依据注解的信息进行相关处理;如果没有注解信息处理流程,则注解意义甚小;
注解可以在包、类、方法和属性上使用,相当于添加了额外的辅助信息,我们可以使用反射机制读取这些元数据,进行相应的处理。
除了系统定义的注解外,我们还可以使用自定义注解。自定义注解使用@interface关键字来声明,自定义注解自动继承了java.lang.annotation.Annotation接口,如下所示:
public enum PrivilegeType
{
Cretae,
Read,
Update,
Delete
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Privilege
{
String name() default "";
PrivilegeType type() default PrivilegeType.Read;
}
需要注意的是:
l 注解中的每一个方法实际上是声明了一个配置参数;
l 方法的名称就是参数的名称;
l 方法的返回值只能是基本数据类型,String,Class和枚举;
l 可以使用default关键字来指定默认值;
l 如果只有一个参数成员,一般参数名为value;
l 注解元素必须要有值,在自定义注解时,经常使用空字符串、0、-1等作为默认值;
在自定义注解时,也用到了其他注解来表明注解的作用范围和保留期限,这些修饰注解的注解称为元注解。Java定义了4个标准的元注解,它们被用来修饰其他annotation,如下
l @Target
用于描述注解的使用范围,即被描述的注解可以用在什么地方,如包、类、方法、属性等;
l @Retention
表示需要在什么级别保存该注解信息,用于描述注解的生命周期,如在源文件保留、在class文件保留及在运行期间保留等;
l @Documented
l @Inherited
如果注解的生命周期为运行时,我们可以使用反射机制,读取这些注解信息,并进行相关的处理,如下
public class Controller
{
public Controller()
{
}
@Privilege(name="User",type=PrivilegeType.Update)
public void updateUser()
{
System.out.println("update user...");
}
}
public class Main
{
public static void main(String[] args)
{
try
{
Class<Controller> clazz=(Class<Controller>) Class.forName("annotation.Controller");
Controller controller=clazz.newInstance();
Method method=clazz.getMethod("updateUser",null);
method.invoke(controller,null);
Privilege privilege=method.getAnnotation(Privilege.class);
System.out.println(privilege.name()+","+privilege.type());
}
catch (Exception e)
{
e.printStackTrace();
}
}
}