注解和自定义注解

一、注解的定义

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

package com.wjjiang.sample.myannotation;

public @interface MyAnnotation {
}

二、注解的使用

package com.wjjiang.sample.myannotation;

@MyAnnotation
public class TestAnnotation {
}

三、元注解

元注解是一种基本注解,但是它能够应用到其它的注解上面。

3.1 @Retention

@Retention 定义了这个注解的的存活时间。
它的取值如下:

  • RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
  • RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
  • RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。(通常在反射时会用到)

3.2 @Documented

@Documented的作用是能够将注解中的元素包含到 Javadoc 中去。

3.3 @Target

@Target 指定了注解运用的地方。
它的取值如下:

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

3.3 @Inherited

@Inherited是说如果一个超类被 @Inherited 注解过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解。

四、注解的属性

注解的属性也叫做成员变量。注解只有成员变量,没有方法。注解的成员变量在注解的定义中以“无形参的方法”形式来声明,其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型。

4.1 属性的值的类型

  1. 8中基本数据类型
  2. 类、注解
  3. 数组
package com.wjjiang.sample.myannotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
import java.util.HashMap;

public @interface MyAnnotation {
    byte myByte() default 1;
    short myShort() default 1;
    int myInt();
    long myLong() default 1;
    float myFloat() default 1;
    double myDouble() default 1;
    char myChar() default 1;
    boolean myBoolean() default true;
    String myString() default "1";
    //声明数组
    int[] myArrays();
    //声明类
    Class<?> myClass() default HashMap.class;
    //枚举类型
    enum MyEnum{first,second};
    //声明枚举
    MyEnum myEnum() default MyEnum.first;
    //声明注解
    Target myTarget() default @Target({ElementType.ANNOTATION_TYPE,ElementType.METHOD});
}

4.2 属性的默认值

注解中属性可以有默认值,默认值需要用 default 关键值指定。比如:

package com.wjjiang.sample.myannotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
import java.util.HashMap;

public @interface MyAnnotation {
    byte myByte() default 1;
}

4.3 注解属性的使用

1.有default的可以不写;
2.数组采用{元素1,元素2}的格式;

package com.wjjiang.sample.myannotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;

@MyAnnotation(myInt = 1,myArrays = {2,3},myString = "string",myClass = java.util.HashMap.class,
        myEnum = MyAnnotation.MyEnum.first,myTarget = @Target(ElementType.TYPE))
public class TestAnnotation {
}

3.如果注解只有一个值value,那么可以省略value=

package com.wjjiang.sample.myannotation;

public @interface MyAnnotation {
    String value();
}
package com.wjjiang.sample.myannotation;

@MyAnnotation("name")
public class TestAnnotation {
}

数组同样可用

package com.wjjiang.sample.myannotation;

public @interface MyAnnotation {
    String[] value();
}
package com.wjjiang.sample.myannotation;

@MyAnnotation({"value1","value2"})
public class TestAnnotation {
}

五、通过反射获取注解(暂定,以后会补全)

  1. 反射出该类的方法;
  2. 通过方法得到注解上具体的信息;
  3. 将注解上的信息注入到方法上。
//反射出该类的方法
Class aClass = Demo2.class;
Method method = aClass.getMethod("add", String.class, int.class);

//通过该方法得到注解上的具体信息
MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
String username = annotation.username();
int age = annotation.age();

//将注解上的信息注入到方法上
Object o = aClass.newInstance();
method.invoke(o, username, age);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值