java 注解_Java注解面试问答

1206cb109ac4683b85adeb59c605e3aa.png

1.简介

自Java 5以来,注解已经出现,而现在,它们是编程结构无处不在的,可以丰富代码。

在本文中,我们将回顾一些关于注解的问题; 通常会在技术面谈时询问,并在适当情况下; 我们将使用示例以更好地理解他们。

2.问题

Q1.什么是注解?他们的典型用例是什么?

注解是绑定到程序源代码元素的元数据,对运行​​代码的操作没有影响。

他们的典型用例是:

  • 编译器的信息 - 使用注解,编译器可以检测错误或抑制警告
  • 编译时和部署时处理 - 软件工具可以处理注解并生成代码,配置文件等。
  • 运行时处理 - 可以在运行时检查注解以自定义程序的行为

Q2.描述标准库中一些有用的注解。

java.lang和java.lang.annotation包中有几个注解,更常见的包括但不限于此:

  • @Override -标记方法是否覆盖超类中声明的元素。如果它无法正确覆盖该方法,编译器将发出错误
  • @Deprecated - 表示该元素已弃用且不应使用。如果程序使用标有此批注的方法,类或字段,编译器将发出警告
  • @SuppressWarnings - 告诉编译器禁止特定警告。在与泛型出现之前编写的遗留代码接口时最常用的
  • @FunctionalInterface - 在Java 8中引入,表明类型声明是一个功能接口,可以使用Lambda Expression提供其实现

Q3.你怎么能创建一个注解?

注解是一种接口形式,其中关键字接口以@开头,其主体包含与方法非常相似的注解类型元素声明:

public 

定义注解后,可以通过代码开始使用它:

@SimpleAnnotation

请注意,为数组元素提供多个值时,必须将它们括在括号中。

只要它们是编译器的常量表达式,就可以提供默认值:

public 

现在,您可以使用没有这些元素的注解:

@SimpleAnnotation

或者只是其中一些:

@

Q4.可以从注解方法声明返回哪些对象类型?

返回类型必须是基本类型,String,Class,Enum或数组类型之一。否则,编译器将抛出错误。

这是一个成功遵循此原则的示例代码:

enum 

下一个示例将无法编译,因为Object不是有效的返回类型:

public 

Q5.哪些程序元素可以注解?

注解可以应用于整个源代码的多个位置。它们可以应用于类,构造函数和字段的声明:

@SimpleAnnotation

方法及其参数:

@SimpleAnnotation

局部变量,包括循环和资源变量:

@SimpleAnnotation

其他注解类型:

@SimpleAnnotation

甚至包,通过package-info.java文件:

@PackageAnnotation

从Java 8开始,它们也可以应用于类型的使用。为此,注解必须指定值为ElementType.USE的@Target注解:

@Target

现在,注解可以应用于类实例创建:

new 

类型转换:

aString 

接口中:

public class SimpleList<T>
  implements @SimpleAnnotation List<@SimpleAnnotation T> {
    // ...
}

抛出异常上:

void 

Q6.有没有办法限制可以应用注解的元素?

有,@ Target注解可用于此目的。如果我们尝试在不适用的上下文中使用注解,编译器将发出错误。

以下是仅将@SimpleAnnotation批注的用法限制为字段声明的示例:

@Target

如果我们想让它适用于更多的上下文,我们可以传递多个常量:

@

我们甚至可以制作一个注解,因此它不能用于注解任何东西。当声明的类型仅用作复杂注解中的成员类型时,这可能会派上用场:

@Target

Q7.什么是元注解?

元注解适用于其他注解的注解。

所有未使用@Target标记或使用它标记但包含ANNOTATION_TYPE常量的注解也是元注解:

@Target

Q8.什么是重复注解?

这些是可以多次应用于同一元素声明的注解。

出于兼容性原因,由于此功能是在Java 8中引入的,因此重复注解存储在由Java编译器自动生成的容器注解中。对于编译器来说,执行此操作有两个步骤。

首先,我们需要声明一个可重复的注解:

@Repeatable

然后,我们使用强制值元素定义包含注解,其类型必须是可重复注解类型的数组:

public 

现在,我们可以多次使用@Schedule:

@Schedule

Q9.你怎么能检索注解?这与保留政策有何关系?

您可以使用Reflection API或注解处理器来检索注解。

该@Retention注解和其的RetentionPolicy参数会影响您检索它们。RetentionPolicy枚举中有三个常量:

  • RetentionPolicy.SOURCE - 使注解被编译器丢弃,但注解处理器可以读取它们
  • RetentionPolicy.CLASS - 表示注解已添加到类文件中,但无法通过反射访问
  • RetentionPolicy.RUNTIME -Annotations由编译器记录在类文件中,并由JVM在运行时保留,以便可以反射性地读取它们

以下是创建可在运行时读取的注解的示例代码:

@Retention

现在,可以通过反射检索注解:

Description 

注解处理器可以使用RetentionPolicy.SOURCE

当您编写Java字节码解析器时,RetentionPolicy.CLASS可用。

Q10.下面的代码会编译吗?

@

不能。如果在@Target注解中多次出现相同的枚举常量,那么这是一个编译时错误。

删除重复常量将使代码成功编译:

@

Q11.是否可以扩展注解?

注解总是扩展java.lang.annotation.Annotation,如Java语言规范中所述。

如果我们尝试在注解声明中使用extends子句,我们将得到一个编译错误:

public 

3.结论

在本文中,我们介绍了Java开发人员关于注解的技术访谈中出现的一些常见问题。这绝不是一份详尽的清单,只应被视为进一步研究的开始。

在此,我们祝愿您在即将进行的面试中取得成功。

原文链接:

Java注解面试问答​mp.weixin.qq.com
538dd781a3461980dace80b134853417.png

相关文章:

Java异常面试问答​mp.weixin.qq.com
489bda7f324e606afd874017bfc051ba.png
Java泛型面试问题​mp.weixin.qq.com
4a10a44e8b35f94c5b1c6b522b2d7004.png

06c8a89e0219c6a0f0033f145e410b73.png
每日福利
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值