Java注解

本文详细介绍了Java中的注解,包括@Override用于标识重写方法,@Deprecated标记不建议使用的代码,以及@SuppressWarnings抑制编译器警告。此外,还探讨了注解的生命周期、使用场景以及如何通过反射获取注解信息。
摘要由CSDN通过智能技术生成

注解

@SuppressWarnings(“deprecation”)的功能是什么?_Java专项练习_牛客网 (nowcoder.com)

Override 注解

指明被注解的方法需要覆写超类中的方法.

如果某个方法使用了该注解,却没有覆写超类中的方法(比如大小写写错了,或者参数错了,或者是子类自己定义的方法),编译器就会生成一个错误.

Deprecated 注解

可以修饰类、方法、变量,在java源码中被@Deprecated修饰的类、方法、变量等表示不建议使用的,可能会出现错误的,可能以后会被删除的类、方法等,如果现在使用,则在以后使用了这些类、方法的程序在更新新的JDK、jar包等就会出错,不再提供支持。 个人程序中的类、方法、变量用@Deprecated修饰同样是不希望自己和别人在以后的时间再次使用此类、方法。 当编译器编译时遇到了使用@Deprecated修饰的类、方法、变量时会提示相应的警告信息。

Suppresswarnings 注解

可以达到抑制编译器编译时产生警告的目的,但是很不建议使用@SuppressWarnings注解,使用此注解,编码人员看不到编译时编译器提示的相应的警告,不能选择更好、更新的类、方法或者不能编写更规范的编码。同时后期更新JDK、jar包等源码时,使用@SuppressWarnings注解的代码可能受新的JDK、jar包代码的支持,出现错误,仍然需要修改。

啥是注解:

注解就是代码中的特殊标记,这些标记可以在编译、类加载、运行时被读取,从而做相对应的处理

注解跟注释很像,区别是注释是给人看的(想想自己遇到那些半句注释没有的业务代码,还是不是很难受?);而注解是给程序看的,它可以被编译器读取

注解本质上就是接口。

定义一个注解: 由@interface声明。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface testAnno{
    String value() default "value-Annotation";
    String name() default "liuer";
}

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface AnnoByMethod{
    String value() default "value-MethodAnnotation";
    String name() default "zher";
}

定义一个注解需要元注解做一些限制:

元注解

Java元注解作用及使用 (biancheng.net)

用来标记注解的注解,自定义注解需要用到。

  1. @Retention 确定注解的生效范围:

    • //指定注解的作用范围,三种,其value为 RetentionPolicy的枚举常量: @Retention(RetentionPolicy.RUNTIME)

      • SOURCE, 在 .java中生效
      • CLASS, 在 .class文件中生效
      • RUNTIME 在运行时生效(JVM)

      生命周期大小排序为 SOURCE < CLASS < RUNTIME

      1. 如果要在编译时进行一些预处理操作,就用 CLASS 注解
      2. 如果只是做一些检查性的操作,比如 @Override 和 @SuppressWarnings,则可选用 SOURCE 注解。
  2. @Target // 指定注解可以在哪些地方使用

    其value为 ElementType的枚举常量 eg:

    @Target(ElementType.TYPE)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dopiqVR2-1656494608314)(D:\Typora\yuancpan\Typora\typora-user-images\image-20220629170208359.png)]

  3. @Documented //指定该注解是否会在 javadoc 体现

  4. @Inherited //子类会继承父类注解

  5. @Repeatable :可在一注解基础上多次使用

  6. @Native :使用 @Native 注解修饰成员变量,则表示这个变量可以被本地代码引用

自定义注解

不会 Java 注解 ? 看这一篇文章! - 知乎 (zhihu.com)

一文助你了解java注解到底是怎么回事 - 知乎 (zhihu.com)

java注解-最通俗易懂的讲解 - 知乎 (zhihu.com)

注解与反射
  1. 通过 Class 对象的 isAnnotationPresent() 方法判断它是否应用了某个注解

    public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {}
    
  2. 通过 getAnnotation() 方法来获取 Annotation 对象。

    public <A extends Annotation> A getAnnotation(Class<A> annotationClass) {}
    
    1. 或者是 getAnnotations() 方法。
    public Annotation[] getAnnotations() {}
    

测试通过反射获取注解信息/属性:

@testAnno(value = "anno")
public class test {
    @AnnoByMethod(value = "method")
    public String getValue(){
        return "";
    }
    public static void main(String[] args) throws NoSuchMethodException {
//        获取到 test的Class类
        Class<? extends test> aClass = test.class;
//        得到 其getValue方法
        Method method = aClass.getMethod("getValue");
//        得到注解类 testAnno
        System.out.println(method.isAnnotationPresent(AnnoByMethod.class));
        AnnoByMethod annotationByMethod = method.getAnnotation(AnnoByMethod.class);
        System.out.println("name-- "+annotationByMethod.name());
        System.out.println("value-- "+annotationByMethod.value());

        System.out.println(aClass.isAnnotation());
        System.out.println(aClass.isAnnotationPresent(testAnno.class));
        testAnno annotationByClass = aClass.getAnnotation(testAnno.class);
        System.out.println("name-- "+annotationByClass.name());
        System.out.println("value-- "+annotationByClass.value());
        try {

        }catch (Exception e){
            e.printStackTrace();
        }
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值