专业的JAVA编程教程与资源

网站首页 > java教程 正文

Java面试常见问题:Java注解(java注解使用案例)

temp10 2025-05-03 16:22:55 java教程 9 ℃ 0 评论

在Java中,注解和class、interface一样,也是一种类型。Java 注解是从 Java5 开始添加到 Java 语言的。SpringBoot框架就广泛地应用了注解,而取代了XML配置文件。对于Java开发人员来说,Java注解也是非常常用的Java语法特性之一。

Java语言有多少个注解呢?

Java最开始的内置注解有7个,其中3个是用来修饰代码的。

Java面试常见问题:Java注解(java注解使用案例)

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

另外还有4个注解是作用在自定义注解上的,是注解的注解,因此也被称为“元注解”。

  • @Retention - 标识这个注解存在的阶段,比如只是存在于代码中(编译器),还是会编入字节码文件中(类加载),或者是在运行时可以通过反射访问(运行时)。
  • @Documented - 能够将注解中的元素包含在用户文档中。
  • @Target - 标记注解应该作用在什么元素上,比如Java类,类方法,或者类属性等。
  • @Inherited - 标记这个注解是继承于哪个注解类。一个被@Inherited作用的注解修饰了一个父类,如果他的子类没有被其他注解修饰,则它的子类也继承了父类的注解。

从 Java 7 开始,又陆续添加了一些新的注解:

  • @SafeVarargs - Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。
  • @FunctionalInterface - Java 8 开始支持,标识一个匿名函数或函数式接口。
  • @Repeatable - Java 8 开始支持的元注解,标识某注解可以在同一个声明上使用多次,而且每次使用注解可以代表不同的含义。
  • @Native - Java 8 开始支持的元注解,使用 @Native 注解修饰成员变量,则表示这个变量可以被本地代码引用。

注解的本质

从上面的图中可以看出,上面提到的所有注解都是接口 Annotation的实现。

package java.lang.annotation;

public interface Annotation {
   boolean equals(Object obj);
   int hashCode();
   String toString();
   Class<? extends Annotation> annotationType();
}

每1个注解都和 1 个 RetentionPolicy 关联。RetentionPolicy 是 Enum 枚举类型,它用来指定 Annotation 的保留策略;每1个注解还和1个或多个 ElementType 关联,ElementType 也是个枚举类型,它用来指定 Annotation 的类型。

如何自定义注解

Java自定义注解用的修饰符是 @interface。

以下代码就定义了一个注解 MyAnnotation

public @interface MyAnnotation {
   //blabla
}

接着我们就可以在类或者方法上使用刚刚定义好的注解。

@MyAnnotation
public class test {
    @MyAnnotation
    public static void main(String[] args){
        //blabla
    }
}

但是刚刚定义的注解是没有任何意义的,要使我们自己的注解工作,就要用到元注解,需要用元注解来修饰我们的注解。前面介绍的元注解最常用的就是:@Retention@Target@Document@Inherited@Repeatable(JDK1.8加入)。

Retention的英文含义就是保留、保持的意思,使用@Retention 就是来决定注解会存在到哪个阶段,是保留在源码,字节码,或者运行期。自定义注解通常都是使用 @Retention(RetentionPolicy.RUNTIME),即保留到运行期。

使用@Target元注解表示注解的类型,若一个 Annotation 对象是 METHOD 类型,则该 Annotation 只能用来修饰方法。

@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
  //blabla
}

这样我们就定义了一个运行时注解MyAnnotation,可以用来作用在类、接口或枚举类型上(ElementType.TYPE)。

注解的作用

最后我们来总结下注解的作用:

  • 提供信息给编译器: 编译器可以利用注解来检测出错误或者警告信息,打印出日志。
  • 编译阶段时的处理: 软件工具可以用来利用注解信息来自动生成代码、文档或者做其它相应的自动处理。
  • 运行时处理: 某些注解可以在程序运行的时候接受代码的提取,自动做相应的操作。

我会持续更新关于物联网、云原生以及数字科技方面的文章,用简单的语言描述复杂的技术,也会偶尔发表一下对IT产业的看法,请大家多多关注,欢迎留言和转发,希望与大家互动交流,谢谢。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表