Java基础16-Java注解简介和最佳实践(二)

简介: Java基础16-Java注解简介和最佳实践(二)


Java基础16-Java注解简介和最佳实践(一):https://developer.aliyun.com/article/1535695

变量注解

下面是一个变量注解的例子:

public class TheClass {  @MyAnnotation(name="someName",  value = "Hello World")  public String myField = null;}

你可以像这样来访问变量的注解:

Field field = ... //获取方法对象</pre><pre>Annotation[] annotations = field.getDeclaredAnnotations();for(Annotation annotation : annotations){ if(annotation instanceof MyAnnotation){ MyAnnotation myAnnotation = (MyAnnotation) annotation; System.out.println("name: " + myAnnotation.name()); System.out.println("value: " + myAnnotation.value()); }}

你可以像这样访问指定的变量注解:

Field field = ...//获取方法对象</pre><pre>Annotation annotation = field.getAnnotation(MyAnnotation.class);if(annotation instanceof MyAnnotation){ MyAnnotation myAnnotation = (MyAnnotation) annotation; System.out.println("name: " + myAnnotation.name()); System.out.println("value: " + myAnnotation.value());}

Java注解相关面试题

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

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

他们的典型用例是:

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

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

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

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

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

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

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

enum Complexity {    LOW, HIGH}public @interface ComplexAnnotation {    Class<? extends Object> value();    int[] types();    Complexity complexity();}

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

public @interface FailingAnnotation {    Object complexity();}

哪些程序元素可以注解?

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

@SimpleAnnotationpublic class Apply {    @SimpleAnnotation    private String aField;    @SimpleAnnotation    public Apply() {        // ...    }}

方法及其参数:

@SimpleAnnotationpublic void aMethod(@SimpleAnnotation String param) {    // ...}

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

@SimpleAnnotationint i = 10;for (@SimpleAnnotation int j = 0; j < i; j++) {    // ...}try (@SimpleAnnotation FileWriter writer = getWriter()) {    // ...} catch (Exception ex) {    // ...}

其他注解类型:

@SimpleAnnotationpublic @interface ComplexAnnotation {    // ...}

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

@PackageAnnotationpackage com.baeldung.interview.annotations;

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

@Target(ElementType.TYPE_USE)public @interface SimpleAnnotation {    // ...}

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

new @SimpleAnnotation Apply();

类型转换:

aString = (@SimpleAnnotation String) something;

接口中:

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

抛出异常上:

void aMethod() throws @SimpleAnnotation Exception {    // ...}

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

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

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

@Target(ElementType.FIELD)public @interface SimpleAnnotation {    // ...}

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

@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PACKAGE })

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

@Target({})public @interface NoTargetAnnotation {    // ...}

什么是元注解?

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

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

@Target(ElementType.ANNOTATION_TYPE)public @interface SimpleAnnotation {    // ...}

下面的代码会编译吗?

@Target({ ElementType.FIELD, ElementType.TYPE, ElementType.FIELD })public @interface TestAnnotation {    int[] value() default {};}

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

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

@Target({ ElementType.FIELD, ElementType.TYPE})
目录
相关文章
|
6天前
|
存储 Java Docker
使用Docker部署Java应用的最佳实践
使用Docker部署Java应用的最佳实践
|
3天前
|
设计模式 测试技术 Python
《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
【7月更文挑战第10天】Page Object Model (POM)是Selenium自动化测试中的设计模式,用于提高代码的可读性和维护性。POM将每个页面表示为一个类,封装元素定位和交互操作,使得测试脚本与页面元素分离。当页面元素改变时,只需更新对应页面类,减少了脚本的重复工作和维护复杂度,有利于团队协作。POM通过创建页面对象,管理页面元素集合,将业务逻辑与元素定位解耦合,增强了代码的复用性。示例展示了不使用POM时,脚本直接混杂了元素定位和业务逻辑,而POM则能解决这一问题。
23 6
|
2天前
|
Java 数据库连接 开发者
Java中的异常处理机制与最佳实践
本文旨在深入探讨Java的异常处理机制,揭示异常处理在程序设计中的重要性及其对软件质量的影响。文章将通过案例分析,阐释异常处理的最佳实践,包括自定义异常类的创建、异常链的使用以及如何避免常见的异常处理陷阱。此外,还将讨论如何利用现代Java版本的特性来优化异常处理策略,提升代码的健壮性和可读性。
|
5天前
|
设计模式 监控 Java
Java中的并发编程模式与最佳实践
随着多核处理器的普及,充分利用并发和多线程成为提高软件性能的关键。Java语言通过其丰富的并发API提供了强大的支持,使得开发者能够构建高效、可靠的并发应用程序。本文深入探讨了Java并发编程的核心概念、设计模式以及在实际开发中的最佳实践,旨在帮助读者更好地理解和掌握Java并发编程,从而编写出更加高效、稳定的应用程序。
|
5天前
|
监控 安全 Java
在Java中集成第三方API调用的最佳实践
在Java中集成第三方API调用的最佳实践
|
6天前
|
Java Spring
使用Java实现自定义注解的方法与技巧
使用Java实现自定义注解的方法与技巧
|
4天前
|
Java 编译器 数据库连接
Java面试题:什么是Java中的注解以及如何自定义注解?举例说明注解的经典用法
Java面试题:什么是Java中的注解以及如何自定义注解?举例说明注解的经典用法
8 0
|
4天前
|
安全 Java
Java多线程系列:Java多线程的核心概念,多线程的挑战与最佳实践
Java多线程系列:Java多线程的核心概念,多线程的挑战与最佳实践
12 0
|
5天前
|
Java API
Java注解与反射机制
Java注解与反射概述: - 注解用于元数据,包括元注解`@Target`, `@Retention`, `@Documented`, `@Inherited`。 - 自定义注解用于自定义行为标记,参考[链接]例化后通过`getClass()`获取类信息。 - 主要API涉及类的多种获取方式,如`对象.getClass()`, `类名.class`, `Class.forName()`和内置类型`TYPE`。 - 应用场景包括动态创建对象,获取泛型和注解信息以及分析运行时结构。
|
2月前
|
安全 Java 编译器
Java其他: 什么是Java中的注解(Annotation)?
Java其他: 什么是Java中的注解(Annotation)?
55 0