Java 注解讲解

怀旧网个人博客网站地址:怀旧网,博客详情:Java 注解讲解

什么是注解

image-20240320093413327

常见注解:

  1. 重写注解
@Override
public String toString() {
    return super.toString();
}
  1. 函数式接口注解
@FunctionalInterface
public interface Runnable {
    public abstract void run();
}
  1. 废弃方法注解
@Deprecated
public final void stop() {}

注解的使用:

image-20240320094301275

当使用了Override注解后,就必须是重写父类的方法,否者就报错。

image-20240320094409536

当使用了 Deprecated 注解,就会将该方法标志位一条删除线(表示不推荐使用了,但是你强行使用也不会报错)

image-20240320094543434

没加注解前

image-20240320094557502

加了注解后,自动提示的警告就会消失(不建议使用)

元注解

image-20240320094902702

Target 注解

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    ElementType[] value(); // 参数就是下面的枚举数据
}

public enum ElementType {
    TYPE,
    FIELD,
    METHOD,
    PARAMETER,
    CONSTRUCTOR,
    LOCAL_VARIABLE,
    ANNOTATION_TYPE,
    PACKAGE,
    TYPE_PARAMETER,
    TYPE_USE
}

作用:表示一个注解可以使用的返回(作用域)

METHOD 就说明智能在一个方法上使用

测试:

image-20240320095429456

注解在方法上就可以,测试在类上

image-20240320095451160

爆红了,说明不可以写在类上---添加作用域

image-20240320095552698

加上TYPE属性,就没有报错了

Retention 注解

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention { // 作用是,注解在哪些时间段可以生效
    RetentionPolicy value();
}

public enum RetentionPolicy { // 参数对应的枚举数据
    SOURCE, 
    CLASS,
    RUNTIME // 使用最多
}

作用域比较: RUNTIME>CLASS>SOURCE

@Target(value = {ElementType.METHOD, ElementType.TYPE})
@Retention(value = RetentionPolicy.RUNTIME )
@interface MyAnnotation{
}

Documented 注解

表示是否将我们的注解生成在javadoc中

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
} // 没有参数,直接使用即可

Inherited 注解

子类可以继承父类的注解

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
} // 没有参数

自定义注解

image-20240320100336075

定义格式

上面可以加元注解(可多选)
@interface 注解名{
    // 中间写参数
}

自定义使用

@Target(value = {ElementType.METHOD, ElementType.TYPE})
@interface MyAnnotation{
}

添加参数

参数定义格式:

参数类型 参数名称();

使用:

image-20240320100815236

没写参数直接报错

image-20240320100839428

这样就不报错了

参数加默认值

String name() default ""; // 定义格式 后面加上default 后面根上默认值

image-20240320101025109

没参数也不报错,因为有了默认值

默认参数名称

String value(); // 当参数名称为value时,在使用时可以不写参数名称

image-20240320101144339

多参数定义

@Target(value = {ElementType.METHOD, ElementType.TYPE})
@interface MyAnnotation{
    String value();
    int age();
    String[] test() default {};
}

使用测试:

@MyAnnotation(value = "怀旧", age = 18)
public class Test2{
    public static void main(String[] args) {
    }
}

@Target(value = {ElementType.METHOD, ElementType.TYPE})
@interface MyAnnotation{
    String value();
    int age();
    String[] test() default {};
}

这边写法没报错,原因value的参数可以不写名称,然后给age进行了赋值,最后的test有默认参数,可以不用赋值。

正常情况,参数不会这么多,最多用1~2个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值