首页 > 编程语言 >Java关于注解的使用、如何自定义注解、如何通过元注解解析注解

Java关于注解的使用、如何自定义注解、如何通过元注解解析注解

时间:2024-07-19 20:57:20浏览次数:18  
标签:控制 Java 自定义 public 使用 注解 class 属性

注解的介绍

Java中总共有五大引用数据类型:类、数组、接口、枚举、注解。其中注解是在jdk1.5版本中加进来的特性,和类,接口,枚举是同一个层次的。

注解应用:

  1. 说明:一般用来对代码进行说明,方便生成doc文档(API文档)
  2. 检查:检查代码是否符合条件@Override(检查重写方法) @FunctionalInterface(检查函数式接口)
  3. 分析:对代码进行分析,起到了代替配置文件的作用。

JDK中的常用注解

@Override:检测此方法是否为重写方法,支持父类、接口的方法重写
@Deprecated:表明此方法已经过时,不推荐使用,如果调用过时的方法,方法上会有横线,但是能用。

public class Person {
    private String name;
    public Integer age;
    @Deprecated
    void test() {
        System.out.println("hhhhhhhh");
    }
}

在这里插入图片描述
@SuppressWarnings:用来消除警告 @SuppressWarnings(“all”) ,all表示消除所有警告。
例如不指定ArrayList的泛型会警告
在这里插入图片描述
加上@SuppressWarnings("all") 就不警告了。
在这里插入图片描述

自定义注解及属性的定义格式

注解属性,其实本质上是抽象方法。但是我们按照属性来理解容易理解,因为到时候使用注解的时候,需要用=为其赋值。
自定义注解:

  public @interface 注解名{
      XXXXXXX
  }

定义属性:增强注解的作用
数据类型 属性名():此属性没有默认值,需要在使用注解的时候为其赋值。
数据类型 属性名() default 值:此属性有默认值,如果有需要,还可以二次赋值。

注解中能定义8种基本类型:
String类型、class类型、枚举类型、注解类型、以及以上类型的一维数组。
在这里插入图片描述

public @interface Car {
    String carname();//品牌
    String[] carParts();//车零件
    int price();//价格
    int count() default 66;//数量
}

注解使用

注解可以在类上使用,方法上使用,成员变量上使用,局部变量上使用,参数位置使用等。
使用格式:
@注解名(属性名 = 值,属性名 = 值...)
属性中有数组的情况:
@注解名(属性名 = {元素1,元素2...})

数量count有默认值所以可以不用指定。
在这里插入图片描述

注解注意事项:

  1. 空注解可以直接使用,空注解就是注解中没有任何的属性
  2. 不同的位置可以使用一样的注解,但是同样的位置不能使用一样的注解
  3. 使用注解时,如果此注解中有属性,注解中的属性一定要赋值,如果有多个属性,用","隔开如果注解中的属性有数组,使用{ }
  4. 如果注解中的属性值有默认值,那么我们不必要写,也不用重新赋值,反之必须写上。
  5. 如果注解中只有一个属性,并且属性名叫value,那么使用注解的时候,属性名不用写,直接写值(包括单个类型,还包括数组)
public @interface Car {
    String value();
}    

在这里插入图片描述
想要解析注解我们需要先使用元注解来管理注解能否在内存中出现,所以我们先介绍元注解

元注解

元注解就是管理注解的注解,它能够

  1. 控制注解的使用位置:控制注解是否能在类上、方法上、构造上使用。
  2. 控制注解的生命周期(加载位置):控制注解是否能在源码中、是否能在class文件中、是否能在内存中出现

@Target:控制注解的使用位置

ElementType[] value();:ElementType是一个枚举,里面的成员可以类名直接调用。
ElementType中的成员包括:

  1. TYPE:控制注解能使用在类上
  2. FIELD:控制注解能使用在属性上
  3. METHOD:控制注解能使用在方法上
  4. PARAMETER:控制注解能使用在参数上
  5. CONSTRUCTOR:控制注解能使用在构造上
  6. LOCAL_VARIABLE:控制注解能使用在局部变量上

@Retention:控制注解的生命周期(加载位置)

RetentionPolicy value();:RetentionPolicy是一个枚举,里面的成员可以类名直接调用
RetentionPolicy中的成员包括:

  1. SOURCE:控制注解能在源码中出现(默认)
  2. CLASS:控制注解能在class文件中出现
  3. RUNTIME:控制注解能在内存中出现

注解的解析

注解的解析就是将注解中的属性值获取出来,涉及到的接口为AnnotatedElement接口
实现类:AccessibleObject、Class、Constructor、Executable、Field、Method、Package、Parameter。
解析过程:先判断指定位置上有没有使用指定的注解。如果有,获取指定的注解,获取注解中的属性值。
boolean isAnnotationPresent(Class<? extends Annotation> annotationClass):判断指定位置上有没有指定的注解
getAnnotation(Class<T> annotationClass):获取指定的注解,返回值类型为获取的注解类型

public class Main {
    public static void main(String[] args) throws Exception {
        //1.获取BookShelf的class对象
        Class<Factory> factoryClass = Factory.class;
        //2.判断bookShelf上有没有Book注解
        boolean b = factoryClass.isAnnotationPresent(Car.class);
        //3.判断,如果b为true,就获取
        if (b) {
            Car car = factoryClass.getAnnotation(Car.class);
            System.out.println("品牌 = " + car.carname());
            System.out.println(Arrays.toString(car.carParts()));
            System.out.println("价格 = " + car.price());
            System.out.println("数量 = " + car.count());
        }
    }
}

在这里插入图片描述

标签:控制,Java,自定义,public,使用,注解,class,属性
From: https://blog.csdn.net/weixin_45797022/article/details/140398361

相关文章

  • 学习Java的第六天(2024.7.19)
    1.容器类、集合类之前学过的容器:数组,但是数组有局限:1.数组存储的数据类型有限制2.数组存储的长度受限2.容器类分为:List,Set,Map3.List类:List是一个接口,他的实现类有:ArrayList,LinkedList,Vectorpublicstaticvoidmain(String[]args){Listlist=newArrayLi......
  • 0基础学JAVA(第六天)
    1.List集合list容器(集合)  之前学过的集合是数组,但是数组只能存储一种类型的数据,而且一旦声明长度之后不能更改,只能建立一个新的数组,所以为了解决这个弊端建立了listlist  接口     有三个实现类:ArrayList    LinkList  Vector1.添加元素  ......
  • 0基础学JAVA(第五天)
    1.String类String类是一个引用类型,默认值为null;字符串在声明之后是一个常量,不能改变,是一个privatefinal修饰的value,只能在类的内部访问,而且类的内部没有提供任何修改的方法,所以是一个常量1.声明字符串:Stringstri="abc你好";stri=newString();stri=n......
  • 0基础学JAVA!!!(第四天)
    1.包装类整型:Byte,Short,Integer,Long浮点型:Float,Double字符型:Character布尔型:BooleanIntegerinta=21;Integerintb=12;System.out.println(inta==intb);Integerintac=200;Integerintc=200;System.out.prin......
  • 0基础学JAVA!!!(第三天)
    0基础学JAVA!!!(第三天)一,方法:(1)方法的定义:  定义一个方法需要有返回值类型 方法的名称(方法的参数){方法体}  返回值类型:当这个方法不需要返回值的时候返回值类型就用void,用void不是返回一个null值,是不返回值!!在用void的时候可以写return,但是不返回值,用作终止方法返回值......
  • java数组之数组工具类——Arrays的使用
    一、Arrays工具类简述    在java的类库中有许多现成的已经封装好的方法,可以供开发人员使用,比如我们之前学的二分法查找或者快速排序等。所以在实际的开发中,我们是不用自己编写这些常用的方法的。那么在常用的数组方法在哪里的?java作为面向对象的语言,所有方法都会封装......
  • 花几千上万学习Java,真没必要!(十四)
    方法:测试代码1:不带参数,不带返回值的方法packagetestmethod.com;publicclassTestClassMethod{//定义一个不带参数且不带返回值的方法publicstaticvoidmyMethod(){//在这里编写方法体System.out.println("Thisismymethod");}......
  • JavaScript实现通过按纽控制电梯上下移动,并实现帧频动画
    varapp=newPIXI.Application(520,460);document.body.appendChild(app.view);//创建背景varbg=newPIXI.Sprite.fromImage("res/lianxi/elevator/bg.png");app.stage.addChild(bg);varelevator=newPIXI.Sprite.fromImage("res/lianxi/elevator/dt......
  • javaScrip的学习(一)
    目录引言一、java和JavaScript的联系二、js中的弹出框1.alert弹出框2.confirm带确认取消的按钮弹框3.prompt带有提示信息且带有输入框的弹框 4.输出到网页中​三、js引入方式1.放在script标签中2.放在外部js文件中四、执行顺序五、书写规范1.语句结尾加分号......
  • Java面试题(企业真题)
    01.泛型的理解泛型是Java5引入的一种特性,它允许程序员在定义类、接口或方法时指定一个或多个类型参数,从而可以在运行时处理各种不同的数据类型,同时保持类型安全。泛型提供了编译时类型检查,消除了强制类型转换的需要,减少了运行时ClassCastException异常的可能性。02.泛型......