Java 注解简介、原理、分类和常见使用场景【持续更新中】

java注解-最通俗易懂的讲解

简介

  1. 一种特殊的类, 相当于“标签”,用于注释说明,可修饰类、接口、方法、参数等。
  2. 注解本身不直接影响代码的操作,但可以被编译器或运行时环境用来生成额外的代码、文件等,或用来控制代码的行为。

实现原理

Java注解是通过反射(Reflection)API和注解处理器(Annotation Processors,在Java 6中引入)来实现的。注解处理器可以在编译时处理注解,生成新的源代码、文件或其他输出。而在运行时,可以通过反射API查询注解信息,并根据这些信息执行相应的逻辑。

自定义注解

注解的属性也叫做成员变量。注解只有成员变量没有方法。注解的成员变量在注解的定义中以“无形参的方法”形式来声明,其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型。

@Documented
@Target({
   ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Description {
   
    String text() default "";
}

分类

元注解

元注解是可以注解到注解上的注解,或者说元注解是一种基本注解,但是它能够应用到其它的注解上面。
可以这样理解:元注解也是一张标签,但是它是一张特殊的标签,它的作用和目的就是给其他普通的标签进行解释说明的。
元标签有 @Retention、@Documented、@Target、@Inherited、@Repeatable 5 种。

元注解中的RetentionPolicy、ElementType

@Documented
@Target({
   ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Description {
   
    String text() default "";
}

RetentionPolicy

RetentionPolicy 定义了注解的保留策略,即注解在何时有效。它有三个分类:

  1. SOURCE:注解只在源码中有效,在编译成.class文件时会被丢弃,不会被加载到JVM中。

    • 示例:虽然@Override注解实际上使用的是CLASS保留策略(因为它在编译时需要被检查),但如果你自定义一个只在源码中使用的注解,可以想象它是为了标记某些代码段或提供IDE中的特定功能,如@Todo("未完成的功能")
  2. CLASS:注解在编译时会被保留在.class文件中,但JVM加载类时不会保留注解,默认情况下注解会使用此策略。

    • 示例@Deprecated注解,它用于标记某个类或方法已过时,这个信息在编译时会被编译器读取,并可能生成警告,但不会被加载到JVM运行时环境中。
  3. RUNTIME:注解在运行时可通过反射API被读取。

    • 示例@Autowired(在Spring框架中),这个注解在运行时由Spring容器通过反射机制查找并注入依赖。

ElementType

ElementType 定义了注解可以应用的Java元素类型。它包含以下分类:

  1. TYPE:类、接口(包括注解类型)或枚举声明。

    • 示例@Component注解应用于类上,表示该类是一个Spring组件。
  2. FIELD:字段声明(包括枚举常量)。

    • 示例@Inject注解应用于字段上,表示该字段需要被注入依赖。
  3. METHOD:方法声明。

    • 示例@Test注解(JUnit框架中),用于标记某个方法是测试方法。
  4. PARAMETER:参数声明。

    • 示例@RequestParam注解(Spring MVC中),用于将HTTP请求参数绑定到控制器方法的参数上。
  5. CONSTRUCTOR:构造器声明。

    • 示例:虽然Java标准库中可能没有直接应用于构造器的注解示例,但在自定义注解时,你可以将其应用于构造器上,以表示某种特殊的构造器用途。
  6. LOCAL_VARIABLE:局部变量声明。

    • 示例@Var(假设的注解),用于标记局部变量具有某种特殊含义或需要特殊处理&#x
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 注解一种数据,它是在程序代码添加的特殊标记,提供额外的信息给编译器、解释器或者其他处理工具使用Java 注解使用场景很广泛,例如在 JUnit 用来标记测试方法,或者在 Spring 用来标记 bean 的属性。每一种注解都有自己特定的使用场景。 以下是 Java 常见注解的详细说明: 1. @Override 使用场景:标记方法覆盖了父类的方法。 示例代码: ``` class Person { public void eat() { System.out.println("Person is eating"); } } class Student extends Person { @Override public void eat() { System.out.println("Student is eating"); } } ``` 注意事项:如果使用 @Override 标记的方法没有覆盖父类的方法,编译器将会报错。 运行原理:编译器会检查当前类是否存在与父类同名方法的声明,如果没有则编译失败。 2. @Deprecated 使用场景:标记不建议使用的方法或类。 示例代码: ``` @Deprecated public class OldClass { //... @Deprecated public void oldMethod() { //... } } ``` 注意事项:如果使用了被 @Deprecated 标记的方法或类,编译器会给出警告。 运行原理:编译器在编译时会发出警告,提醒用户不要使用被 @Deprecated 标记的方法或类。 3. @SuppressWarnings 使用场景:抑制编译器产生的警告。 示例代码: ``` @SuppressWarnings("unchecked") public void uncheckedMethod() { List list = new ArrayList(); } ``` 注意事项:不要滥用 @SuppressWarnings 注解,应该尽可能避免使用。 运行原理:编译器在编译时会忽略被 @SuppressWarnings 标记的警告。 4. @FunctionalInterface 使用场景:标记函数式接口。 示例代码: ``` @FunctionalInterface interface MyInterface { void myMethod(); } ``` 注意事项:被标记为 @FunctionalInterface 的接口只能有一个抽象方法。 运行原理:编译器会检查被标记为 @FunctionalInterface 的接口是否只有一个抽象方法,如果不是则编译失败。 5. @Retention 使用场景:指定注解的保留策略。 示例代码: ``` @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { //... } ``` 注意事项:@Retention 注解只能用于注解声明。 运行原理:指定注解的保留策略,可以是 SOURCE、CLASS 或者 RUNTIME。 6. @Target 使用场景:指定注解的作用范围。 示例代码: ``` @Target(ElementType.METHOD) public @interface MyAnnotation { //... } ``` 注意事项:@Target 注解只能用于注解声明。 运行原理:指定注解的作用范围,可以是 TYPE、FIELD、METHOD 等。 以上是 Java 常见注解的详细说明,每一种注解都有自己特定的使用场景和注意事项,开发者应该根据实际需求合理使用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值