Java注解


✌全网粉丝20W+,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌

🍅文末获取项目下载方式🍅
链接点击直达下载链接


注解的定义-
注解(Annotation)是一种标记性的接口,注解本质上是一个接口,它继承了Annotation接口,注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,它可以声明在包,类,字段,局部变量,方法参数等的前面,用来对这些元素进行说明,注释。-
Java预置的注解-
@Override-
@Deprecaed-
这些注解是用来标记过时的元素,想必大家在日常开发中经常碰到。编译器在编译阶段遇到这个注解时会发出提醒警告,告诉开发者正在调用一个过时的元素比如过时的方法,过时的类,过时的成员变量。-
自定义注解-
自定义注解与定义接口有一些相似。在interface前加@即可。

//自定义一个注解
public @interface TestAnnoation {
    
}

不过,要想注解能够正常工作,还需要介绍一下一个新的概念,那就是元注解。-
元注解-
元注解是可以注解到注解上的注解,或者说元注解是一种基本注解,但是它能够用到其它的注解 上面。-
如果难于理解的话,你可以这样理解。元注解也是一张标签,但是它是一张特殊的标签,它的作用和目的就是给其他普通的标签进行解释说明的。-
元标签有@Retention,@Documented,@Target,@inherited

@Retention-
Retention的英文意为保留期的意思。当@Retention应用到一个注解上的时候,它解释说名了这个注解的存活时间。-
@Retention它的取值如下:-
RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将丢弃忽视。-
RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并 不会被加载到JVM中。-
RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到JVM中,所以在程序运行时可以获取到它。

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

@Retention(RetentionPolicy.SOURCE) //只是在源码阶段保留,有3个值
public @interface TestAnnoation {

}

@Target-
Target是目标的意思,@Target指定了注解运用的地方。-
你可以这样理解,当一个注解被@Target注解时,这个注解就被限定了运用的场景。它只能注解到方法上,类上,方法参数上等等-
@Target它的取值如下:-
ElementType.ANNOTATION_TYPE 可以给一个注解进行注解。-
ElementType.CONSTRUCTOR 可以给构造方法进行注解。-
ElementType.FIELD 可以给属性进行注解。-
ElementType.LOCAL_VARIABLE 可以给局部变量进行注解。-
ElementType.METHOD 可以给方法进行注解。-
ElementType.PACKAGE 可以给一个包进行注解。-
ElementType.PARAMETER 可以给一个方法内的参数进行注解。-
ElemetnType.TYPE 可以给一个类型进行注解,比如类,接口,枚举。

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

@Target(ElementType.TYPE) //可以给一个类型进行注解,比如类,接口,枚举。
public @interface TestAnnoation {

}

@Inherited-
Inherited是继承的意思,但是它并不是说注解本身可以继承,而是说如果一个超类被@Inherited注解过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这给子类就继承了超类的注解。

注解的属性-
注解既然本质上是接口,那么注解里面自然就是抽象方法,也被叫做属性。

import java.lang.annotation.*;

@Target(ElementType.TYPE) //可以给一个类型进行注解,比如类,接口,枚举。
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface TestAnnoation {
    int id();
    String message();
}

使用该注解

@TestAnnoation(id=1,message = "hello")
public class Test {  
}

还可以给注解属性设置默认值

import java.lang.annotation.*;

@Target(ElementType.TYPE) //可以给一个类型进行注解,比如类,接口,枚举。
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface TestAnnoation {
    int id() default -1;
    String message() default "hello";
}

注解的提取-
我们通过用标签来比作注解,前面的内容是讲怎么写注解,然后贴到哪个地方去,而现在我们要做的工作就是检阅这些标签内容。形象的比喻就是你把这些注解标签在合适的时候撕下来,然后检阅上面的内容信息。

要想正确检阅注解,离不开一个手段,那就是反射。

自定义注解(下面都使用该注解测试)

import java.lang.annotation.*;
//修饰方法时该为ElementType.FIELD
@Target(ElementType.TYPE) //可以给一个类型进行注解,比如类,接口,枚举。
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface TestAnnoation {
    int id() default -1;
    String message() default "hello";
}

类上注解的提取-
注解通过反射获取。首先可以通过Class对象的isAnnotationPresent()方法判断它是否应用了某个注解。然后通过getAnnotation()方法来获取Annotation对象或者是getAnnotations()方法。

@TestAnnoation()
public class Test {
    public static void main(String[] args) {
        boolean isHas = Test.class.isAnnotationPresent(TestAnnoation.class);//判断Test类上是否有TestAnnoation注解
        if(isHas){
            TestAnnoation annotation = Test.class.getAnnotation(TestAnnoation.class);//获取到TestAnnoation注解
            System.out.println(annotation.id());
            System.out.println(annotation.message());
        }
    }
}

属性上注解的提取

import java.lang.reflect.Field;

public class Test4 {
    @TestAnnoation(id = 6)
    int id;
    public static void main(String[] args) throws Exception {
        //获取到属性
        Field id = Test4.class.getDeclaredField("id");
        id.setAccessible(true);
        TestAnnoation annotation = id.getAnnotation(TestAnnoation.class);
        System.out.println(annotation.id());
    }
}

方法上注解的提取

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

public class Test4 {
    @TestAnnoation()
    public void test(){
        System.out.print("test");
    }

    public static void main(String[] args) throws Exception {
        Method method = Test4.class.getDeclaredMethod("test");
        method.setAccessible(true);
        Annotation[] declaredAnnotations = method.getDeclaredAnnotations();
        for(int i=0;i<declaredAnnotations.length;i++){
            System.out.print(declaredAnnotations[i]);
        }
    }
}

当开发者使用了Annotation修饰了类,方法,Field等成员之后,这些Annotation不会直接生效,必须由开发者提供相应的代码来提取并处理Annotation信息。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值