java注解


目录

一、概述
二、定义注解类
   2.1 注解定义
   2.2 注解属性类型
   2.3 注解的作用目标限定
   2.4 注解类型
三、使用注解
四、读取注解(反射)
   4.1 反射Class上注解
   4.2 反射method上注解

一、概述

注解是为了取代配置文件,使用注解进行配置,其语法为:@注解名称(注解参数)。
    使用注解分为三步:
    1.定义注解类
    2.使用注解
    3.读取注解

二、定义注解类

2.1 注解定义

//定义注解
@interface student{
    //定义注解中的属性,格式:类型 名称()
    String name();
    //携带默认值
    int age() default 100;
}

//value属性
@interface stud{
    int value();
    String address() default "hz";
}

2.2 注解属性类型

注解支持的属性类型:
基本数据类型、String、Class、Enum、注解类型、上述一维数组类型

enum MyEnum{
    A,B,C
}

@interface myAnnota{
    //1.基本类型
    int a();
    //2.String类型
    String b();
    //3.Class类型
    Class c();
    //4.enum类型
    MyEnum d();
    //5.注解类型
    student e();
    //6.以上类型的一维数组类型
    String[] f();
}

2.3 注解的作用目标限定

限定注解的使用目标,如类使用的注解、方法使用的注解等

@Target(value={ElementType.TYPE,ElementType.FIELD,ElementType.METHOD})
@interface myAnno{
    int age;
}

可选参数ElementType:

public enum ElementType {
    /** Class, interface (including annotation type), or enum declaration */
    TYPE,

    /** Field declaration (includes enum constants) */
    FIELD,

    /** Method declaration */
    METHOD,

    /** Parameter declaration */
    PARAMETER,

    /** Constructor declaration */
    CONSTRUCTOR,

    /** Local variable declaration */
    LOCAL_VARIABLE,

    /** Annotation type declaration */
    ANNOTATION_TYPE,

    /** Package declaration */
    PACKAGE
}

2.4 注解类型

一般选择RUNTIME类型注解,可以被反射

@Retention(value=RetentionPolicy.RUNTIME)
@interface student{
    //定义注解中的属性,格式:类型 名称()
    String name();
    //携带默认值
    int age() default 100;
}


三、使用注解

使用场景:类、方法、构造器、参数、变量、包
//使用注解
@student(name="xiaoming",age=23)
public class Demo {

    //默认给value赋值,场景:只给value赋值时可以省略value=
    @stud(200)
    private int id;

}

//注解属性类型使用
@myAnnota(
        a=100,
        b="lilei",
        c=String.class,
        d=MyEnum.A,
        e=@student(age=35,name="lucy"),
        f={"beijing","shanghai","guangzhou"}
)
class Demo{

}

四、读取注解(反射)

4.1 反射Class上注解

//定义注解
@Retention(value=RetentionPolicy.RUNTIME)
@interface student{
    //定义注解中的属性,格式:类型 名称()
    String name();
    //携带默认值
    int age() default 100;
}

//使用注解
@student(name="xiaoming",age=23)
class DemoClass {

    //默认给value赋值,场景:只给value赋值时可以省略value=
    @stud(200)
    private int id;

    @stud(30)
    public void func(){}

}

//反射注解
@Test
public void reflectAnnotation(){

    //1.获取目标
    Class<DemoClass> clazz = DemoClass.class;

    //2.获取指定类型的注解
    student stu = clazz.getAnnotation(student.class);

    //3.访问注解对象的属性
    System.out.println("[name : "+stu.name()+", age : "+stu.age()+"]");

}

输出:
   [name : xiaoming, age : 23]

4.2 反射method上注解

//定义注解
@Retention(value=RetentionPolicy.RUNTIME)
@interface stud{
    int value();
    String address() default "hz";
}

//使用注解
@student(name="xiaoming",age=23)
class DemoClass {

    //默认给value赋值,场景:只给value赋值时可以省略value=
    @stud(200)
    private int id;

    @stud(30)
    public void func(){}

}

//反射注解
@Test
public void reflectMethodAnnotation() throws NoSuchMethodException, SecurityException{
    //1.获取目标
    Class<DemoClass> clazz = DemoClass.class;
    Method methodFunc = clazz.getMethod("func");

    //2.获取指定类型注解
    stud stu = methodFunc.getAnnotation(stud.class);

    //3.访问注解对象属性
    System.out.println("[value : "+stu.value()+" , address : "+stu.address()+"]");  
    }

输出:
   [value : 30 , address : hz]

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值