热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Java中的注解详解及示例代码

本文主要介绍Java中的注解,这里提供了详细的相关资料,及示例代码,帮助大家学习理解,有兴趣的小伙伴可以参考下

在Java中,注解(Annotation)引入始于Java5,用来描述Java代码的元信息,通常情况下注解不会直接影响代码的执行,尽管有些注解可以用来做到影响代码执行。

注解可以做什么

Java中的注解通常扮演以下角色

  1. 编译器指令
  2. 构建时指令
  3. 运行时指令

其中

  1. Java内置了三种编译器指令,本文后面部分会重点介绍
  2. Java注解可以应用在构建时,即当你构建你的项目时。构建过程包括生成源码,编译源码,生成xml文件,打包编译的源码和文件到JAR包等。软件的构建通常使用诸如Apache Ant和Maven这种工具自动完成。这些构建工具会依照特定的注解扫描Java代码,然后根据这些注解生成源码或文件。
  3. 通常情况下,注解并不会出现在编译后的代码中,但是如果想要出现也是可以的。Java支持运行时的注解,使用Java的反射我们可以访问到这些注解,运行时的注解的目的通常是提供给程序和第三方API一些指令。

注解基础

一个简单的Java注解类似与@Entity。其中@的意思是告诉编译器这是一个注解。而Entity则是注解的名字。通常在文件中,写法如下

public @interface Entity {
}

注解元素

Java注解可以使用元素来进行设置一些值,注解中的元素类似于属性或者参数。定义包含元素的注解示例代码

public @interface Entity {
  String tableName();
}

使用包含元素的注解示例代码

@Entity(tableName = "vehicles")

上述注解的元素名称为tableName,设置的值为vehicles。没有元素的注解不需要使用括号。

如果注解包含多个元素,使用方法如下

@Entity(tableName = "vehicles", primaryKey = "id")

如果注解只有一个元素,通常我们的写法是这样的

@InsertNew(value = "yes")

但是这种情况下,当且仅当元素名为value,我们也可以简写,即不需要填写元素名value,效果如下

@InsertNew("yes")

注解使用

注解可以用来修饰代码中的这些元素

  1. 接口
  2. 方法
  3. 方法参数
  4. 属性
  5. 局部变量

一个完整的使用示例如下

@Entity
public class Vehicle {

  @Persistent
  protected String vehicleName = null;


  @Getter
  public String getVehicleName() {
    return this.vehicleName;
  }

  public void setVehicleName(@Optional vehicleName) {
    this.vehicleName = vehicleName;
  }

  public List addVehicleNameToList(List names) {

    @Optional
    List localNames = names;

    if(localNames == null) {
      localNames = new ArrayList();
    }
    localNames.add(getVehicleName());

    return localNames;
  }

}

内置的Java注解

Java中有三种内置注解,这些注解用来为编译器提供指令。它们是

  1. @Deprecated
  2. @Override
  3. @SuppressWarnings

@Deprecated

可以用来标记类,方法,属性。
如果上述三种元素不再使用,使用@Deprecated注解
如果代码使用了@Deprecated注解的类,方法或属性,编译器会进行警告。

@Deprecated使用很简单,如下为注解一个弃用的类。

@Deprecated
public class MyComponent {

}


当我们使用@Deprecated注解后,建议配合使用对应的@deprecated JavaDoc符号,并解释说明为什么这个类,方法或属性被弃用,已经替代方案是什么。

@Deprecated
/**
 @deprecated This class is full of bugs. Use MyNewComponent instead.
*/
public class MyComponent {

}

@Override

@Override注解用来修饰对父类进行重写的方法。如果一个并非重写父类的方法使用这个注解,编译器将提示错误。

实际上在子类中重写父类或接口的方法,@Overide并不是必须的。但是还是建议使用这个注解,在某些情况下,假设你修改了父类的方法的名字,那么之前重写的子类方法将不再属于重写,如果没有@Overide,你将不会察觉到这个子类的方法。有了这个注解修饰,编译器则会提示你这些信息。

使用Override注解的例子

public class MySuperClass {

  public void doTheThing() {
    System.out.println("Do the thing");
  }
}


public class MySubClass extends MySuperClass{

  @Override
  public void doTheThing() {
    System.out.println("Do it differently");
  }
}

@SuppressWarnings

@SuppressWarnings用来抑制编译器生成警告信息。

可以修饰的元素为类,方法,方法参数,属性,局部变量

使用场景:当我们一个方法调用了弃用的方法或者进行不安全的类型转换,编译器会生成警告。我们可以为这个方法增加

@SuppressWarnings注解,来抑制编译器生成警告。

注意:使用@SuppressWarnings注解,采用就近原则,比如一个方法出现警告,我们尽量使用@SuppressWarnings注解这个方法,而不是注解方法所在的类。虽然两个都能抑制编译器生成警告,但是范围越小越好,因为范围大了,不利于我们发现该类下其他方法的警告信息。

使用示例

@SuppressWarnings
public void methodWithWarning() {

}

创建自己的注解

在Java中,我们可以创建自己的注解,注解和类,接口文件一样定义在自己的文件里面。如下

@interface MyAnnotation {
  String  value();
  String  name();
  int   age();
  String[] newNames();
}

上述代码定义了一个叫做MyAnnotation的注解,它有4个元素。再次强调一下,@interface这个关键字用来告诉java编译器这是一个注解。

仔细一看,你会发现,注解元素的定义很类似于接口的方法。这些元素有类型和名称。这些类型可以是

  1. 原始数据类型
  2. String
  3. Class
  4. annotation
  5. 枚举
  6. 一维数组

如下为应用自定义的注解

@MyAnnotation(
  value="123",
  name="Jakob",
  age=37,
  newNames={"Jenkov", "Peterson"}
)
public class MyClass {


}

注意,我们需要为所有的注解元素设置值,一个都不能少。

注解元素默认值

对于注解中的元素,我们可以为其设置默认值,使用方法为

@interface MyAnnotation {
  String  value() default "";
  String  name();
  int   age();
  String[] newNames();
}

上述代码,我们设置了value元素的默认值为空字符串。当我们在使用时,可以不设置value的值,即让value使用空字符串默认值。 使用示例代码

@MyAnnotation(
  name="Jakob",
  age=37,
  newNames={"Jenkov", "Peterson"}
)
public class MyClass {

}

@Retention

@Retention是用来修饰注解的注解,使用这个注解,我们可以做到

控制注解是否写入class文件
控制class文件中的注解是否在运行时可见

控制很简单,使用使用以下三种策略之一即可。

RetentionPolicy.SOURCE 表明注解仅存在源码之中,不存在.class文件,更不能运行时可见。常见的注解为@Override, @SuppressWarnings。
RetentionPolicy.CLASS 这是默认的注解保留策略。这种策略下,注解将存在与.class文件,但是不能被运行时访问。通常这种注解策略用来处于一些字节码级别的操作。
RetentionPolicy.RUNTIME 这种策略下可以被运行时访问到。通常情况下,我们都会结合反射来做一些事情。

@Retention的使用示例

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {
  String  value() default "";
}

@Target

使用@Target注解,我们可以设定自定义注解可以修饰哪些java元素。简单示例

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;

@Target({ElementType.METHOD})
public @interface MyAnnotation {
  String  value();
}

上述的代码说明MyAnnotation注解只能修饰方法。

@Target可以选择的参数值有如下这些

  1. ElementType.ANNOTATION_TYPE(注:修饰注解)
  2. ElementType.CONSTRUCTOR
  3. ElementType.FIELD
  4. ElementType.LOCAL_VARIABLE
  5. ElementType.METHOD
  6. ElementType.PACKAGE
  7. ElementType.PARAMETER
  8. ElementType.TYPE(注:任何类型,即上面的的类型都可以修饰)

@Inherited

如果你想让一个类和它的子类都包含某个注解,就可以使用@Inherited来修饰这个注解。

java.lang.annotation.Inherited

@Inherited
public @interface MyAnnotation {

}
1
2
@MyAnnotation
public class MySuperClass { ... }
1
public class MySubClass extends MySuperClass { ... }

上述代码的大致意思是

1.使用@Inherited修饰注解MyAnnotation
2.使用MyAnnotation注解MySuperClass
3.实现一个类MySubclass继承自MySuperClass

通过以上几步,MySubClass也拥有了MyAnnotation注解。

关于Java中的注解,一些基本的概念就是这些。

以上 就是关于Java 中的注解资料整理,后续继续补充相关资料,谢谢大家对本站的支持!


推荐阅读
  • 本文深入解析了通过JDBC实现ActiveMQ消息持久化的机制。JDBC能够将消息可靠地存储在多种关系型数据库中,如MySQL、SQL Server、Oracle和DB2等。采用JDBC持久化方式时,数据库会自动生成三个关键表:`activemq_msgs`、`activemq_lock`和`activemq_ACKS`,分别用于存储消息数据、锁定信息和确认状态。这种机制不仅提高了消息的可靠性,还增强了系统的可扩展性和容错能力。 ... [详细]
  • 如何使用 `org.apache.poi.openxml4j.opc.PackagePart` 类中的 `loadRelationships()` 方法及其代码示例详解 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • Hadoop平台警告解决:无法加载本机Hadoop库的全面应对方案
    本文探讨了在Hadoop平台上遇到“无法加载本机Hadoop库”警告的多种解决方案。首先,通过修改日志配置文件来忽略该警告,这一方法被证明是有效的。其次,尝试指定本地库的路径,但未能解决问题。接着,尝试不使用Hadoop本地库,同样没有效果。然后,通过替换现有的Hadoop本地库,成功解决了问题。最后,根据Hadoop的源代码自行编译本地库,也达到了预期的效果。以上方法适用于macOS系统。 ... [详细]
  • 本文详细介绍了在CentOS 6.5 64位系统上使用阿里云ECS服务器搭建LAMP环境的具体步骤。首先,通过PuTTY工具实现远程连接至服务器。接着,检查当前系统的磁盘空间使用情况,确保有足够的空间进行后续操作,可使用 `df` 命令进行查看。此外,文章还涵盖了安装和配置Apache、MySQL和PHP的相关步骤,以及常见问题的解决方法,帮助用户顺利完成LAMP环境的搭建。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 本文深入探讨了如何利用Maven高效管理项目中的外部依赖库。通过介绍Maven的官方依赖搜索地址(),详细讲解了依赖库的添加、版本管理和冲突解决等关键操作。此外,还提供了实用的配置示例和最佳实践,帮助开发者优化项目构建流程,提高开发效率。 ... [详细]
  • 在Java Web服务开发中,Apache CXF 和 Axis2 是两个广泛使用的框架。CXF 由于其与 Spring 框架的无缝集成能力,以及更简便的部署方式,成为了许多开发者的首选。本文将详细介绍如何使用 CXF 框架进行 Web 服务的开发,包括环境搭建、服务发布和客户端调用等关键步骤,为开发者提供一个全面的实践指南。 ... [详细]
  • 在使用USB接口的二维条码扫描器时,发现其无法正确识别条码中的中文字符。然而,采用串口连接的方式则能够成功识别。目前面临的问题是如何将通过串口获取的数据在网页中进行实时展示,希望各位专家能提供解决方案,不胜感激。 ... [详细]
  • NFT市场热度持续攀升,波卡能否抓住机遇迎来NFT夏季热潮?
    NFT市场热度持续攀升,波卡能否抓住机遇迎来NFT夏季热潮? ... [详细]
  • Python多线程编程技巧与实战应用详解 ... [详细]
  • 本文深入探讨了如何选择适合业务需求的MySQL存储引擎,详细解析了不同存储引擎的特点、适用场景及其在数据存储和管理中的优势。通过对比InnoDB、MyISAM等主流引擎,为读者提供了全面的技术指导和专业建议,帮助开发者在实际应用中做出明智的选择。 ... [详细]
  • 如何在Windows 7系统中配置和设置无线路由器?
    随着无线设备的普及,如智能手机和平板电脑,WiFi已成为日常生活中的必备功能。许多家庭拥有无线路由器,但不清楚如何正确设置。本文将详细介绍如何在Windows 7系统中配置和设置无线路由器,帮助用户轻松实现稳定高效的无线网络连接。 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 在优化Nginx与PHP的高效配置过程中,许多教程提供的配置方法存在诸多问题或不良实践。本文将深入探讨这些常见错误,并详细介绍如何正确配置Nginx和PHP,以实现更高的性能和稳定性。我们将从Nginx配置文件的基本指令入手,逐步解析每个关键参数的最优设置,帮助读者理解其背后的原理和实际应用效果。 ... [详细]
author-avatar
傻要傻到嗨样
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有