java--注解

来源:互联网 发布:mac删掉windows 编辑:程序博客网 时间:2024/06/05 00:08

注解的工作原理就是,先使用注解修饰java代码,然后另一块叫做注解处理器的代码会解析这段注解和被修饰的代码并做相应的处理。

元注解

元注解负责注解自定义注解。

@Target;
@Retention;
@Documented;
@Inherited。
Java5.0定义了4个元注解。接下来,分别分析这四个元注解:

@Target
@Target用来说明自定义注解可以用在什么地方,其ElementType取值有
1. CONSTRUCTOR:用于描述构造器
2. FIELD:用于描述域
3. LOCAL_VARIABLE:用于描述局部变量
4. METHOD:用于描述方法
5. PACKAGE:用于描述包
6. PARAMETER:用于描述参数
7. TYPE:用于描述类、接口(包括注解类型) 或enum声明

@Retention
@Retention用来描述自定义注解的生命周期,其RetentionPoicy取值有:
1. SOURCE:在源文件中有效
2. CLASS:在class文件中有效
3. RUNTIME:在运行时有效

3.1.3 @Documented

@Documented用于表示自定义注解可以被javadoc之类的工具文档化,没有成员。

使用示例:@Documented

3.1.4 @Inherited

@Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。

@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。

当@Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,则反射API增强了这种继承性。如果我们使用java.lang.reflect去查询一个@Inherited annotation类型的annotation时,反射代码检查将展开工作:检查class和其父类,直到发现指定的annotation类型被发现,或者到达类继承结构的顶层。

自定义注解

3.2 开始自定义注解

定义注解格式:

  public @interface 注解名 {定义体}

注解参数的可支持数据类型:

所有基本数据类型(int,float,boolean,byte,double,char,long,short)
String类型
Class类型
enum类型
Annotation类型
以上所有类型的数组
使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。

@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。

注意:

只能用public或默认(default)这两个访问权修饰.例如,String value();这里把方法设为defaul默认类型; 

参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和 String,Enum,Class,annotations等数据类型,以及这一些类型的数组.例如,String value();这里的参数成员就为String;  

如果只有一个参数成员,最好把参数名称设为”value”,后加小括号.

自定义注解和解析

定义一个注解@Persion:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Persion {
String name() default “zcx”;
int age() default 18;

String[] hobby() default {"basketball", "football"};

}

再定义一个注解@StudentGender:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface StudentGender {

public enum Gender{BOY, GIRL};Gender gender() default Gender.BOY;

}

定义一个类,使用刚才定义的两个注解:
@Persion(name=”haha”, age=97, hobby={“test1”, “test2”})
public class Student {

@StudentGender(gender=Gender.BOY)private String stuGender;public String getStuGender() {    return stuGender;}public void setStuGender(String stuGender) {    this.stuGender = stuGender;}

}

定义一个注解处理器,用于处理注解内容:
public class AnnotationProcessor {
public static void getStudentInfo(Class

自定义注解

自定义简单注解
http://blog.csdn.net/u010902721/article/details/52576624
权限管理
http://blog.csdn.net/zhuyangxing/article/details/18796091

http://blog.csdn.net/Minhellic/article/details/51919690

权限控制注解
http://blog.csdn.net/v123411739/article/details/25899693

原创粉丝点击