首页 > 编程语言 >java 注解

java 注解

时间:2024-03-07 16:46:30浏览次数:82  
标签:java void class Inherited 注解 ElementType public

1、什么是注解

      类似一种特殊的注释,可以在程序运行时被反射获取,如同标签。

2、注解分类

  • 内置注解
  • 自定义注解

内置注解
Java 定义了一套注解,共有 7 个,3 个在 java.lang 中,剩下 4 个在 java.lang.annotation 中。

  • 作用在代码的注解:
    @Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
    @Deprecated - 标记过时方法。如果使用该方法,会报编译警告。
    @SuppressWarnings - 指示编译器去忽略注解中声明的警告。

  • 作用在其他注解的注解(或者说元注解):
    @Retention - 保留期,标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。
    @Documented - 作用是能够将注解中的元素包含到 Javadoc 中去。
    @Target - 标记这个注解运用的地方。
    @Inherited - 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)

  • 从 Java 7 开始,额外添加了 3 个注解:
    @SafeVarargs - Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。
    @FunctionalInterface - Java 8 开始支持,标识一个匿名函数或函数式接口。
    @Repeatable - Java 8 开始支持,标识某注解可以在同一个声明上使用多次。

自定义注解

      先知道一个点,注解的属性也叫做成员变量。注解只有成员变量,没有方法。注解的成员变量在注解的定义中以“无形参的方法”形式来声明,其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型。

@Target(ElementType.METHOD) // 表示注释到方法上
@Retention(RetentionPolicy.RUNTIME) // 保留到程序运行的时候
public @interface Info {
    public int id();
    public String desc() default "暂无";
}

// 一开始看到注解总是有点懵,感觉像是一般类的成员变量和方法的总和,但查的时候上面说注解里只有成员变量(属性)
class Demo {
    //类属性,(成员属性不会加访问权限修饰符)
    private int id;
    private String name;
    public void show(){}
    public void add(){}
}

注解提取

// 被注解的类
public class Demo01 {
    private int id;
    private String name;
    @Info(id=101)
    public void show(){
    }
    @Info(id=102,desc = "这是一个显示信息方法...")
    public void display(){
    }
    public void add(){}
}
import java.lang.reflect.Method;

//  解析类
public class InfoTracker {
    public static void main(String[] args) {
        InfoTracker it = new InfoTracker();
        it.tracker(Demo01.class);
    }

    private void tracker(Class<?> cls) {
        Info info = null;
        for(Method method:cls.getDeclaredMethods()){
            //  判断是否有info注解
            if(method.isAnnotationPresent(Info.class)){
                System.out.println(method.getName() + "上有info注解...");
                //  获取注解
                info = method.getAnnotation(Info.class);
                System.out.println(info.id() + "\t" + info.desc());
                continue;
            }
            System.out.println(method.getName() + "上没有注解");
        }
    }
}

元注解的值

@Retention

RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。

@Target

ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
ElementType.CONSTRUCTOR 可以给构造方法进行注解
ElementType.FIELD 可以给属性进行注解
ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
ElementType.METHOD 可以给方法进行注解
ElementType.PACKAGE 可以给一个包进行注解
ElementType.PARAMETER 可以给一个方法内的参数进行注解
ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举

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

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@interface Test {}
@Test
public class A {}
public class B extends A {}

注解 Test 被 @Inherited 修饰,之后类 A 被 Test 注解,类 B 继承 A,类 B 也拥有 Test 这个注解。

参考:https://zhuanlan.zhihu.com/p/37701743

标签:java,void,class,Inherited,注解,ElementType,public
From: https://www.cnblogs.com/slothion/p/18059049

相关文章

  • macOS m1芯片报错 java.lang.UnsatisfiedLinkError: no taos in java.library.path
    项目中有用到TDengine,MacOSm1芯片本地开发启动项目报错如下java.lang.UnsatisfiedLinkError:notaosinjava.library.path方案一(推荐)以上错误是因为java在连接TDengine数据库的时候没有找到本地函数库。本地安装一下TDengine,然后在/usr/local/lib/下就会有taos函数库。因此......
  • java过滤器拦截路劲问题
    在我们使用filter过滤器时注解@WebFilter("/serverlet/demo1/")多层目录只针对文件注解@WebServlet(name="Servlet1",value="/serverlet/demo1/test1")具有过滤作用(原因:注解路径相同),其中“@WebFilter("/serverlet/demo1/")”括号里的*代表只要serverlet注解前半部分相同的文......
  • 熟悉又陌生的JavaWeb 第2天
    传送门JSP基本语法什么是servlet自定义Servlet,直接使用抽象好的HttpServlet更好MyCustomServletpublicclassMyCustomServletextendsHttpServlet{@SerialprivatestaticfinallongserialVersionUID=-599450886992695746L;@Overrideprotected......
  • c#与java之间的区别盘点
    原文链接:http://www.mobiletrain.org/about/BBS/119467.htmlhttps://blog.csdn.net/clpig0125/article/details/50774628C#(CSharp)是Microsoft开发的一种面向对象的编程语言,而Java是由SunMicrosystems开发的一种面向对象的编程语言。虽然它们都是面向对象的编程语言,但它们之......
  • Spring-@Bean-注解
    1.作用用于将对象存入spring的ioc容器中。@controller、@Service、@Component、@Configuration、@Repository等几个注解是一样的,都是负责将对象存入容器当中,而@Bean是用在方法上,将当前方法的返回值对象放到容器当中。2.使用@Bean一般出现在方法上面,也可用于自定义......
  • Spring-@ControllerAdvice-全局处理注解
    1,@ControllerAdvice介绍@ControllerAdvice是Spring框架提供的一个注解,用于定义全局的异常处理器和全局数据绑定。它通常用于集中处理应用程序中的异常,并提供统一的异常处理逻辑。2,@ControllerAdvice的基本使用packageorg.springframework.web.bind.annotation;importj......
  • 卡码java基础课 | 10.平均绩点
    学习内容:字符串的声明和初始化字符串的常见操作字符串的特点读取字符串输入equals方法字符串格式化输出format和printf字符串的遍历flag编程思想switch-case浮点数运算重点归纳:字符串1.声明和初始化:Stringname="Hello,Java";Stringmessage=newString("Hello"......
  • Blazor笔记-JavaScript Interop(JS互调用)
    更新记录注意:非教程。纯笔记,日常查询用的。需要教程的小伙伴找几本书看看即可哈哈,有Vue基础的话非常快,概念都是通的。非工作需要不建议深入学习Blazor,深入Vue吧,用的多,哈哈。完整目录地址:https://www.cnblogs.com/cqpanda/p/17596348.html点击查看2024年3月7日发布。2023......
  • java date 时间最大连续天数
    javalocaldate时间最大连续天数publicclassDateUtils{publicstaticDateaddDays(Datetime,Integerday){try{SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd");Calendarcd=Calendar.getInstance();cd.setTime(ti......
  • RxJava3 用法
    https://github.com/xxm-sz/blog/issues/14主要变化主要特点单一依赖:Reactive-Streams继续支持Java6+和Android2.3+修复了API错误和RxJava2的许多限制旨在替代RxJava2,具有相对较少的二进制不兼容更改提供Java8lambda友好的API关于并发源的不同意见异步或同步执行......