【JAVASE】注解

文章介绍了Java中的注解,包括其概述、JDK内置的`@Override`和`@Deprecated`注解、元注解的作用、注解中定义属性的方式、如何通过反射处理注解以及注解在实际开发中的应用,如用于标识类的ID属性检查。
摘要由CSDN通过智能技术生成

1.概述

注解,也叫注释,是一种引用数据类型。编译后也同样生成class字节码文件。

  • 语法
[修饰符列表] @inteface 注解类型名 {
}
  • 使用
@注解类型名

可以出现在类上,属性上,方法上,变量上,注解类型上。

package com.sdnu.java.annotation;

public @interface MyAnnotation {
}
package com.sdnu.java.annotation;

@MyAnnotation
public @interface OtherAnnotation {
}
package com.sdnu.java.annotation;

/**
 * 注解1
 *
 * @author Beyong
 * @date 2023/03/02 11:42
 **/
@MyAnnotation
public class AnnotationTest01 {
    @MyAnnotation
    private int no;
    @MyAnnotation
    public AnnotationTest01(){

    }
    @MyAnnotation
    public static void m1(){

    }
    @MyAnnotation
    public void m2(){

    }
}

@MyAnnotation
interface MyInterface{

}

@MyAnnotation
enum Season{
    SPRING,SUMMER,AUTUMN,WINTER
}

2.JDK内置注解

2.1override注解

  • 只能注解方法
    进行编译检查,如果没有重写父类方法,则会编译器报错。
    在这里插入图片描述

2.2 Deprecated注解

用来标注已过时。

package com.sdnu.java.annotation;

/**
 * 注解Deprecated
 *
 * @author Beyong
 * @date 2023/03/02 20:11
 **/
public class AnnotationTest03 {
    public static void main(String[] args) {
        Test.myMethod();
    }
}

class Test{
    @Deprecated
    public static void myMethod(){
        System.out.println("hhh");
    }
}

在这里插入图片描述

3.元注解

用来标注注解类型的注解,叫做元注解。常见元注解

  • Target
    用来标记被注解可以出现在哪些位置上。
  • Retention
    在这里插入图片描述

4.注解中定义属性

package com.sdnu.java.annotation;

@MyAnnotation
public @interface OtherAnnotation {
    String name();
    String color();
    int age() default 20;
}

在这里插入图片描述

4.1 属性value

如果一个注解的属性名是value,则改属性名可以省略。

4.2 属性是一个数组

5. 反射注解

注解

package com.sdnu.java.annotation.annotation5;

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

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String value() default "北京";
}
package com.sdnu.java.annotation.annotation5;

/**
 * test
 *
 * @author Beyong
 * @date 2023/03/02 21:24
 **/
@MyAnnotation
public class MyAnnotationClassTest {
    int i;
    public MyAnnotationClassTest(){}
    @MyAnnotation
    public void doSome(){
        int i;
    }
}
package com.sdnu.java.annotation.annotation5;

/**
 * 反射注解
 *
 * @author Beyong
 * @date 2023/03/02 21:27
 **/
public class ReflectAnnotationTest{
    public static void main(String[] args) throws Exception{
        Class c = Class.forName("com.sdnu.java.annotation.annotation5.MyAnnotationClassTest");
        System.out.println(c.isAnnotationPresent(MyAnnotation.class));
        if(c.isAnnotationPresent(MyAnnotation.class)){
            MyAnnotation myAnnotation = (MyAnnotation) c.getAnnotation(MyAnnotation.class);
            System.out.println("类上的注解对象"+ myAnnotation);
            String value = myAnnotation.value();
            System.out.println(value);
        }
        Class stringClass = Class.forName("java.lang.String");
        System.out.println(stringClass.isAnnotationPresent(MyAnnotation.class)); //false
    }
}

在这里插入图片描述

6.注解在开发中的作用

Id类注解

package com.sdnu.java.annotation.annotation7;

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

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Id {
}

User类

package com.sdnu.java.annotation.annotation7;

/**
 * user
 *
 * @author Beyong
 * @date 2023/03/02 20:48
 **/
@Id
public class User {
    int id;
    String name;
    String password;
}

异常类

package com.sdnu.java.annotation.annotation7;

/**
 * 自定义异常
 *
 * @author Beyong
 * @date 2023/03/02 20:55
 **/
public class HasNotIdPropertyException extends RuntimeException {
    public HasNotIdPropertyException(){}
    public HasNotIdPropertyException(String s){
        super(s);
    }
}

测试类

package com.sdnu.java.annotation.annotation7;

import java.lang.reflect.Field;

/**
 * test
 *
 * @author Beyong
 * @date 2023/03/02 20:48
 **/
public class Test {
    public static void main(String[] args) throws Exception{
        Class userClass = Class.forName("com.sdnu.java.annotation.annotation7.User");
        boolean isOk = false;
        if (userClass.isAnnotationPresent(Id.class)){
            Field[] fields = userClass.getDeclaredFields();
            for(Field field : fields){
                if("id".equals(field.getName()) && "int".equals(field.getType().getSimpleName())){
                    isOk = true;
                    break;
                }
            }
            if(!isOk){
                throw new HasNotIdPropertyException("被标准的类必须有一个int类型的id属性");
            }
        }
    }
}

不改变上述代码:
在这里插入图片描述
改变User类中的int id 为其它,则出现:
在这里插入图片描述
在这里插入图片描述

作者:Beyong    
出处:Beyong博客
github地址:https://github.com/beyong2019

本博客中未标明转载的文章归作者Beyong有,欢迎转载,但未经作者同意必须保留此段声明,且在文章明显位置给出原文连接,否则保留追究法律责任的权利。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值