java高级--------注解

java高级--------注解

1.定义

1)注解是JDK1.5引入的新特性,大部分框架都用注解简化代码并提高编码效率
2)Annotation通常在package、Class、Field、Method上,目的是与其他类、成员变量、方法上做标识,已实现一些特定功能

注解的定义:通过@interface关键字进行定义

public @interface MyAnnotation{
}

2.元注解

jdk提供了几个特殊的注解,只能用于注解上面

1)@Target: 表示该注解可以用于什么地方,取值如下

ElementType.ANNOTATION_TYPE  可以给注解进行注解
ElementType.CONSTRUCTOR      可给构造方法进行注解
ElementType.FIELD            可给属性注解
ElementType.LOCAL_VARIABLE   可给局部变量进行注解
ElementType.METHOD           可给方法进行注解
ElementType.PACKAGE          可给包进行注解
ElementType.PARAMETER        可给一个方法内的参数进行注解
ElementType.TYPE             可给类进行注解,比如类、接口、枚举

2)@Retention:表示注解传递存活时间

RetentionPolicy.SOURCE      注解只在源码阶段保留,编译阶段被丢弃
RetentionPolicy.CLASS       注解保留到编译阶段,不会加载到jvm中
RetentionPolicy.RUNTIME     注解在运行时有效,能加载到jvm中(反射经常用到)

3)@Documented: 将注解中的元素包含到javadoc中

4)@Inherited: 允许子类继承父类中的注解

如果父类上有注解@Test,而@Test注解上有@Inherited注解,那么该父类的子类也默认继承@Test注解

3.注解的属性

注解的属性也叫成员变量,注解只有成员变量,没有方法
1.注解的成员变量在注解的定义中以“无参的方法”形式来定义
2.其方法名称定义了该成员变量的名字,其返回值定义了该成员变量的类型
3.注解中可以有默认值,默认值需要以default关键值指定

eg:

@Inherited//表示可被子类继承
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {

    String value();

    int sex() default 1;// 0男1女
}

注意:

如果一个注解内仅存在一个名字为value的属性时,应用这个注解可以直接将值写在括号内
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnoton {

    String value();
}

@TestAnnoton("dsd")
public class People {
}

自定义注解编写的规则

1.所有的Annotion会自动继承java.lang.annotation.Annotation,并不能继承别的类或者是接口
2.参数成员只能用public或者default两个访问修饰符
3.参数成员只能用基本数据类型(char,boolean,byte,short,int,long,float,double)和String,Enum,Class
Annotations数据类型,以及这一些类型的数组
4.获取类方法和字段的注解信息,通过java反射技术实现

4.获取类上的注解

public <A extends Annotation> A getAnnotation(Class<A> annotationClass)     通过类型获取注解对象
public Annotation[] getAnnotations()                                        获取所有注解
public Annotation[] getDeclaredAnnotations()                                获取所有类上注解(不包括继承的注解)

eg:

public static void main(String[] args) {
    try {
        Class<?> aClass = Class.forName("com.annotion.entity.People");
        MyAnnotation annotation = aClass.getAnnotation(MyAnnotation.class);
        if (annotation != null){
            System.out.println(annotation.value() +"  "+ annotation.annotationType() + "  "+ annotation.sex());
        }
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}

5.获取字段上的注解

eg:

Field[] peopleFiles = aClass.getDeclaredFields();
for (Field field : peopleFiles) {
    FieldAnnotation fileAnnotation = field.getAnnotation(FieldAnnotation.class);
    if (fileAnnotation != null){
        System.out.println("Field:"+field.getName()+":"+fileAnnotation.value());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值