<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Java%E6%B3%A8%E8%A7%A3</id>
	<title>Java注解 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Java%E6%B3%A8%E8%A7%A3"/>
	<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Java%E6%B3%A8%E8%A7%A3&amp;action=history"/>
	<updated>2026-07-18T06:49:24Z</updated>
	<subtitle>在这个wiki上该页的修订历史</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://arolstar52-zhtest.hf.space/index.php?title=Java%E6%B3%A8%E8%A7%A3&amp;diff=551445&amp;oldid=prev</id>
		<title>imported&gt;Cwek：​/* 内置的注解 */</title>
		<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Java%E6%B3%A8%E8%A7%A3&amp;diff=551445&amp;oldid=prev"/>
		<updated>2023-11-24T03:15:22Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;内置的注解&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{noteTA|G1=IT}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Java注解&amp;#039;&amp;#039;&amp;#039;又称&amp;#039;&amp;#039;&amp;#039;Java标注&amp;#039;&amp;#039;&amp;#039;，是[[Java]]语言5.0版本开始支持加入[[源代码]]的特殊语法[[元数据]]&amp;lt;ref&amp;gt;{{cite web|url = http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html|title = JDK 5.0开发者指南：标注|date = 2007-12-18|accessdate = 2008-03-05|publisher = [[Sun Microsystems]]|archive-date = 2008-03-06|archive-url = https://web.archive.org/web/20080306060928/http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html|dead-url = no}}.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
Java语言中的类、方法、变量、参数和包等都可以被标注。和[[Javadoc]]不同，Java标注可以通过反射获取标注内容。在[[编译器]]生成[[类文件]]时，标注可以被嵌入到[[字节码]]中。[[Java虚拟机]]可以保留标注内容，在运行时可以获取到标注内容&amp;lt;ref&amp;gt;{{citation|title = Java (TM)语言规范|edition = 第三版|publisher = Prentice Hall|year = 2005|isbn = 0321246780|url = http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html|author = [[Sun Microsystems]]|accessdate = 2009-06-14|archive-date = 2012-02-29|archive-url = https://web.archive.org/web/20120229183526/http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html|dead-url = no}}.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
当然它也支持自定义Java标注&amp;lt;ref&amp;gt;{{cite web &lt;br /&gt;
 |url=http://www.25hoursaday.com/ &lt;br /&gt;
 |title=A COMPARISON OF MICROSOFT&amp;#039;S C# PROGRAMMING LANGUAGE TO SUN MICROSYSTEMS&amp;#039; JAVA PROGRAMMING LANGUAGE: Metadata Annotations &lt;br /&gt;
 |author=Dare Obasanjo &lt;br /&gt;
 |authorlink= &lt;br /&gt;
 |year=2007 &lt;br /&gt;
 |work= &lt;br /&gt;
 |publisher=Dare Obasanjo &lt;br /&gt;
 |archiveurl=https://web.archive.org/web/20120919093308/http://25hoursaday.com/ &lt;br /&gt;
 |archivedate=2012-09-19 &lt;br /&gt;
 |accessdate=2012-09-20 &lt;br /&gt;
 |deadurl=yes &lt;br /&gt;
 }}&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== 历史 ==&lt;br /&gt;
Java 平台有许多特别的注解，例如 &amp;lt;tt&amp;gt;transient&amp;lt;/tt&amp;gt; 修饰符，&amp;lt;code&amp;gt;@deprecated&amp;lt;/code&amp;gt; javadoc 标签。2002 年，文案 JSR-175 提出了通用需求的注解（或者说元注解）手段，并在 2004 年 9 月收到许多人的赞赏。&amp;lt;ref&amp;gt;{{cite web|url = http://www.jcp.org/en/jsr/detail?id=175#2|title = JSR 175: A Metadata Facility for the JavaTM Programming Language|date = 2006-11-02|accessdate = 2008-03-05|first = Danny|last = Coward|publisher = [[Java Community Process]]|archive-date = 2011-03-06|archive-url = https://web.archive.org/web/20110306190628/http://jcp.org/en/jsr/detail?id=175#2|dead-url = no}}&amp;lt;/ref&amp;gt;从 JDK 1.5 开始，java 开始支持注解。Annotation Processing tool （或者说 &amp;lt;tt&amp;gt;apt&amp;lt;/tt&amp;gt; tool） 提供了一个补充性的编译时注解操作的接口。文档 JSR-269 将它规范化，在 JDK 1.6 写入编译器 javac 中。&lt;br /&gt;
&lt;br /&gt;
== 内置的注解 ==&lt;br /&gt;
Java 定义了一套注解，共有 7 个，3 个在 java.lang 中，剩下 4 个在 java.lang.annotation 中&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 | url         = https://docs.oracle.com/javase/tutorial/java/annotations/predefined.html&lt;br /&gt;
 | title         = Predefined Annotation Types&lt;br /&gt;
 | publisher         = [[Oracle Corporation]]&lt;br /&gt;
 | accessdate         = 2016-12-17&lt;br /&gt;
 | archive-date         = 2020-12-23&lt;br /&gt;
 | archive-url         = https://web.archive.org/web/20201223095839/https://docs.oracle.com/javase/tutorial/java/annotations/predefined.html&lt;br /&gt;
 | dead-url         = no&lt;br /&gt;
 }}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 | url         = http://www.java2s.com/Tutorial/Java/0020__Language/TheBuiltInAnnotations.htm&lt;br /&gt;
 | title         = The Built-In Annotations : Standard Annotations&lt;br /&gt;
 | accessdate         = 2016-12-17&lt;br /&gt;
 | archive-date         = 2021-01-10&lt;br /&gt;
 | archive-url         = https://web.archive.org/web/20210110151007/http://www.java2s.com/Tutorial/Java/0020__Language/TheBuiltInAnnotations.htm&lt;br /&gt;
 | dead-url         = no&lt;br /&gt;
 }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
作用在代码的注解是：&lt;br /&gt;
* &amp;lt;tt&amp;gt;@Override&amp;lt;/tt&amp;gt; - 检查该方法是否是重写方法。如果发现其父类，或者是引用的接口中并没有该方法时，会报编译错误。&lt;br /&gt;
* &amp;lt;tt&amp;gt;@Deprecated&amp;lt;/tt&amp;gt; - 标记过时方法。如果使用该方法，会报编译警告。&lt;br /&gt;
* &amp;lt;tt&amp;gt;@SuppressWarnings&amp;lt;/tt&amp;gt; - 指示编译器去忽略注解中声明的警告。&lt;br /&gt;
&lt;br /&gt;
作用在其他注解的注解（或者说 元注解）是：&lt;br /&gt;
* &amp;lt;tt&amp;gt;@Retention&amp;lt;/tt&amp;gt; - 标识这个注解怎么保存，是只在代码中，还是编入class文件中，或者是在运行时可以通过反射访问。&lt;br /&gt;
* &amp;lt;tt&amp;gt;@Documented&amp;lt;/tt&amp;gt; - 标记这些注解是否包含在用户文档中。&lt;br /&gt;
* &amp;lt;tt&amp;gt;@Target&amp;lt;/tt&amp;gt; - 标记这个注解应该是哪种 Java 成员。&lt;br /&gt;
* &amp;lt;tt&amp;gt;@Inherited&amp;lt;/tt&amp;gt; - 标记这个注解是继承于哪个注解类（默认下，注解并没有继承于任何子类）&lt;br /&gt;
&lt;br /&gt;
从 Java 7 开始，额外添加了 3 个注解：&lt;br /&gt;
* &amp;lt;tt&amp;gt;@SafeVarargs&amp;lt;/tt&amp;gt; - Java 7 开始支持，忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。&lt;br /&gt;
* &amp;lt;tt&amp;gt;@FunctionalInterface&amp;lt;/tt&amp;gt; - Java 8 开始支持，标识一个匿名函数或函数式接口。&lt;br /&gt;
* &amp;lt;tt&amp;gt;@Repeatable&amp;lt;/tt&amp;gt; - Java 8 开始支持，标识某注解可以在同一个声明上使用多次。&lt;br /&gt;
&lt;br /&gt;
== 实例 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  // @Twizzle标注toggle()方法。&lt;br /&gt;
  @Twizzle&lt;br /&gt;
  public void toggle() {&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // 声明Twizzle标注&lt;br /&gt;
  public @interface Twizzle {&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
标注可以包含一个关键字和值的对所构成的列表：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  //等同于 @Edible(value = true)&lt;br /&gt;
  @Edible(true)&lt;br /&gt;
  Item item = new Carrot();&lt;br /&gt;
&lt;br /&gt;
  public @interface Edible {&lt;br /&gt;
    boolean value() default false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  @Author(first = &amp;quot;Oompah&amp;quot;, last = &amp;quot;Loompah&amp;quot;)&lt;br /&gt;
  Book book = new Book();&lt;br /&gt;
&lt;br /&gt;
  public @interface Author {&lt;br /&gt;
    String first();&lt;br /&gt;
    String last();&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
标注声明中可以用标注说明使用方式、时间和对象：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  @Retention(RetentionPolicy.RUNTIME) // 该标注可以在运行时通过反射访问。&lt;br /&gt;
  @Target({ElementType.METHOD})       // 该标注只用于类内方法。&lt;br /&gt;
  public @interface Tweezable {&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译器保留一组标注用于特定语法目的 (包括 &amp;lt;tt&amp;gt;@Deprecated&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;@Override&amp;lt;/tt&amp;gt;和&amp;lt;tt&amp;gt;@SuppressWarnings&amp;lt;/tt&amp;gt;等)。&lt;br /&gt;
&lt;br /&gt;
标注通常用于软件[[框架]]为用户定义的类和方法提供引用外部资源的情形，如XML配置文件、事务环境等。以下是一个标注过的EJB 3.0的类：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  @Entity                                           // 声明实体类&lt;br /&gt;
  @Table(name = &amp;quot;people&amp;quot;)                           // 映射该类到 &amp;quot;people&amp;quot;表&lt;br /&gt;
  class Person implements Serializable {&lt;br /&gt;
    @Id                                             // 映射到主键&lt;br /&gt;
    @GeneratedValue(strategy = GenerationType.AUTO) // 数据库自动生成键值&lt;br /&gt;
    private Integer id;&lt;br /&gt;
&lt;br /&gt;
    @Column(length = 32)                            // 限长32个字符&lt;br /&gt;
    private String name;&lt;br /&gt;
&lt;br /&gt;
    public Integer getId() {&lt;br /&gt;
      return id;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setId(Integer id) {&lt;br /&gt;
      this.id = id;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public String getName() {&lt;br /&gt;
      return name;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setName(String name) {&lt;br /&gt;
      this.name = name;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以上代码中标注不执行任何特定行为，而是为在运行时，EJB容器获得足够的信息，生成对象到关系数据库的映射。&lt;br /&gt;
== 参考引用 ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Java]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Cwek</name></author>
	</entry>
</feed>