@Target,@Retention,@Documented 注释的作用

@Target

target英文有目标、目的的意思。 @Target在java中是注释类。@Target作用于修饰的注释可以修饰的类型范围

@Target包含一个ElementType[]元素类型的数组。ElementType[]数组值value,表明Target修饰的注释可以修饰的类型范围。ElementType枚举值包含方法、属性、类等等。

ANNOTATION_TYPE: 注解只能修饰注解,不能修饰其他的东西

CONSTRUCTOR: 注解只能修饰构造方法

FIELD: 注解只能修饰属性(成员变量) 字段加解密注解标记拦截

LOCAL_VARIABLE: 注解只能修饰局部变量

METHOD: 注解只能修饰方法 对应的方法进行拦截

PACKAGE: 注解只能修饰包

PARAMETER: 注解只能修饰方法的参数

TYPE: 注解只能修饰类、接口、枚举

@Retention

作用是用来修饰注解的,一共有三种策略,定义在RetentionPolicy枚举中.

从注释上看:

source:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;被编译器忽略

class:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期

runtime:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在

这3个生命周期分别对应于:Java源文件(.java文件) ---> .class文件 ---> 内存中的字节码。

那怎么来选择合适的注解生命周期呢?

首先要明确生命周期长度 SOURCE < CLASS < RUNTIME ,所以前者能作用的地方后者一定也能作用。一般如果需要

在运行时去动态获取注解信息,那只能用 RUNTIME 注解;如果要 在编译时进行一些预处理操作,比如生成一些辅助

代码(如 ButterKnife) ,就用 CLASS注解;如果 只是做一些检查性的操作,比如 @Override 和

@SuppressWarnings,则 可选用 SOURCE 注解。

Documented:说明该注解将会被包含在JavaDoc文档中,我们常见的JDK帮助文档参考手册就是JavaDoc。

<think>好的,我现在需要回答用户关于Java中@符号的问题。首先,我应该先回忆一下自己对这个知识点的理解,然后组织语言,确保结构清晰,符合用户的要求。 用户的问题是“介绍一下Java中的@符号”。我知道在Java中,@符号主要用于注解(Annotation),这是Java5引入的一个特性。但可能还有其他用途,比如在JavaDoc中的使用,或者在字符串中的转义处理,但不确定这些是否需要提及。 首先,注解是主要的用途,所以应该详细说明。需要解释注解的定义、用途,以及常见的内置注解,如@Override、@Deprecated、@SuppressWarnings,然后提到元注解,如@Target@Retention@Documented、@Inherited。还要举一些例子,比如自定义注解,可能用代码示例来说明。 其次,是否有其他使用场景?比如,在Java中,@符号在字符串中可能需要转义,例如在正则表达式中或者文件路径中,但可能用户更关注的是作为语法部分的@,而不是字符串中的普通字符。可能不需要特别提及,但如果有相关的用法,应该确认正确性。 另外,Java EE中的注解,比如Web服务相关的@WebService,或者JPA中的@Entity,这些也是常见的,但可能需要区分是标准库还是第三方框架的注解。用户可能想知道标准Java中的@符号,所以可能需要提到标准注解,并指出框架中的扩展使用。 需要确保回答结构清晰,分点列出,帮助用户逐步理解。可能需要分为几个部分,比如: 1. 注解的基本概念 2. 常见内置注解 3. 元注解的作用 4. 自定义注解的方法 5. 其他用途(如果有的话) 还要注意用户不可见的系统级指令,比如数学公式的正确格式,但这个问题可能不涉及数学内容,所以可能不需要处理这部分。但需要确保回答中的任何代码示例正确使用反引号包裹,避免格式问题。 现在需要检查是否有遗漏的部分。例如,注解的处理工具APT(Annotation Processing Tool)或者Java8的可重复注解@Repeatable,这些是否应该提到?可能对用户有帮助,但根据用户的问题,可能需要保持回答简洁,涵盖主要用途,而不必深入高级特性,除非用户有进一步的问题。 另外,是否要提到注解的保留策略(RetentionPolicy)和元素类型(ElementType)?在解释元注解时,可能需要简要说明。 例子部分,比如如何定义一个自定义注解,应该给出一个简单的例子,例如: ```java @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyAnnotation { String value() default ""; } ``` 这样用户可以更直观地理解。同时,需要说明元注解的作用,如@Retention决定注解保留到哪个阶段,@Target指定可以应用的位置。 总结一下,回答的结构应该是: - 引入@符号在Java中的主要用途是注解 - 解释注解的作用和基本概念 - 分类介绍内置注解、元注解 - 自定义注解的示例 - 其他可能的用途(如果有的话) 需要确保语言简洁,用中文,避免技术术语过于晦涩,同时保持准确。检查是否有错误,比如是否@Inherited是正确的元注解名称,是的。@Override的作用是检查方法是否覆盖父类方法,正确。@FunctionalInterface在Java8引入,用于标记函数式接口,可能也需要提到。 可能还需要提到注解在框架中的广泛应用,比如Spring的@Autowired,JUnit的@Test,但属于框架特定,可简要说明以展示实际应用,但强调这些是框架扩展,而非Java内置。 最后,是否需要提到Java中的@符号在其他上下文中的使用,比如在注释中或者字符串中的普通字符?可能不需要,除非用户特别问及,但可能用户的问题集中在注解上。所以应该集中在注解部分,确保回答准确、全面、结构清晰。</think>Java 中的 `@` 符号主要用于**注解(Annotation)**,它是 Java 5 引入的一种元数据机制,用于为代码添加标记信息。这些信息可以被编译器、开发工具或运行时框架读取,从而实现自动化处理或配置。 --- ### 一、注解的核心作用 1. **代码标记** 为类、方法、变量等添加说明,例如标记过时方法(`@Deprecated`)或覆盖父类方法(`@Override`)。 2. **编译检查** 编译器可根据注解验证代码逻辑,如 `@Override` 会检查方法是否真的覆盖了父类方法。 3. **自动化处理** 框架(如 Spring、JUnit)通过读取注解实现依赖注入(`@Autowired`)、单元测试(`@Test`)等功能。 --- ### 二、常见内置注解 1. **基础注解** - `@Override`:标记方法覆盖父类/接口的实现。 ```java @Override public void toString() { ... } ``` - `@Deprecated`:标记方法/类已过时,使用时编译器会警告。 - `@SuppressWarnings`:抑制编译器警告。 ```java @SuppressWarnings("unchecked") List list = new ArrayList(); ``` 2. **元注解(用于定义注解的注解)** - `@Target`:指定注解可应用的目标(如类、方法、字段)。 ```java @Target(ElementType.METHOD) // 只能用于方法 public @interface MyAnnotation { ... } ``` - `@Retention`:定义注解的保留阶段(源码、编译期、运行时)。 ```java @Retention(RetentionPolicy.RUNTIME) // 运行时保留 public @interface MyAnnotation { ... } ``` - `@Documented`:将注解包含在 Javadoc 中。 - `@Inherited`:允许子类继承父类的注解。 --- ### 三、自定义注解 通过 `@interface` 关键字定义,可包含属性和默认值: ```java @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface Author { String name(); // 属性 String date() default "2023-01-01"; // 带默认值的属性 } // 使用自定义注解 @Author(name = "Alice") public class MyClass { ... } ``` --- ### 四、其他用途 1. **Java 8 的可重复注解** 使用 `@Repeatable` 允许同一注解多次使用: ```java @Repeatable(Authors.class) public @interface Author { ... } @Author(name = "Bob") @Author(name = "Charlie") public class MyClass { ... } ``` 2. **函数式接口标记** `@FunctionalInterface` 确保接口是函数式接口(仅含一个抽象方法): ```java @FunctionalInterface public interface Runnable { void run(); } ``` --- ### 五、框架中的应用(扩展) - **Spring**:`@Autowired`(依赖注入)、`@Component`(标记组件类)。 - **JUnit**:`@Test`(单元测试方法)、`@BeforeEach`(测试前置操作)。 - **JPA**:`@Entity`(标记数据库实体类)。 --- ### 总结 Java 的 `@` 符号是注解的核心标识符,通过它能够实现代码标记、自动化配置和框架扩展。无论是内置注解还是自定义注解,都极大地提升了代码的可读性和开发效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值