文章目录
- 前言
- 注解
- 使用场景
- 常用注释
-
- [1. @Override](#1. @Override)
- [2. @Deprecated](#2. @Deprecated)
- [3. @SuppressWarnings](#3. @SuppressWarnings)
- 自定义注解与元注解
前言
Java是一门功能强大且广泛应用的编程语言,具有跨平台性和高效的执行速度,广受开发者喜爱。在接下来的学习过程中,我将记录学习过程中的基础语法、框架和实践技巧等,分享学习心得,对自己学习过程进行整理和总结,也希望能为其他学习Java的朋友提供一些帮助和参考。
注解
在Java中,注解(Annotation)是一种特殊类型的元数据,用于提供关于程序的结构、行为或其他信息,而不直接影响程序的运行逻辑。注解可以用于类、方法、字段、参数等元素,帮助开发者在代码中嵌入额外的说明或指令。
注解可以在类编译、运行时进行加载,体现不同的功能。
使用场景
- 生成文档相关的注解
- 在编译时进行格式检查(JDK内置的三个基本注解)
- 跟踪代码依赖性,实现替代配置文件功能
常用注释
在Java中,@Override
、@Deprecated
和@SuppressWarnings
是三个常用的注解,各自的用途如下:
1. @Override
-
用途:标识一个方法是重写父类中的方法。
-
作用:编译器会检查方法是否正确重写了超类的方法。如果方法名、参数类型或数量不匹配,编译器会报错,帮助开发者避免错误。
-
示例 :
javaclass Parent { void display() { System.out.println("Parent"); } } class Child extends Parent { @Override void display() { System.out.println("Child"); } }
2. @Deprecated
-
用途:标记某个方法、类或字段不再推荐使用,可能在将来的版本中删除。
-
作用:编译器会发出警告,提示开发者该元素已过时,建议使用替代方案。
-
示例 :
javaclass OldClass { @Deprecated void oldMethod() { System.out.println("This method is deprecated"); } }
3. @SuppressWarnings
-
用途:用于抑制特定的编译器警告。
-
作用:可以指定需要抑制的警告类型,例如"unchecked"或"deprecation",使得代码更清晰且不受不必要的警告影响。
-
示例 :
javaclass SuppressWarningsExample { @SuppressWarnings("unchecked") void exampleMethod() { List list = new ArrayList(); // 无检查警告 list.add("String"); } }
自定义注解与元注解
元注解就是对现有的解释进行解释说明的注解。
以下展示创建自定义注释以及元注解的使用:
1. 定义自定义注解
使用 @interface
关键字来定义注解。可以指定一些元注解(如 @Target
和 @Retention
)来控制注解的使用范围和生命周期。
示例:
java
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
// 定义自定义注解
@Target(ElementType.METHOD) // 该注解只能用于方法
@Retention(RetentionPolicy.RUNTIME) // 在运行时可用
public @interface MyCustomAnnotation {
String value() default "Default Value"; // 注解元素,具有默认值
}
2. 使用自定义注解
可以在类或方法上使用自定义注解。
java
public class AnnotationExample {
@MyCustomAnnotation(value = "Custom Annotation Example")
public void annotatedMethod() {
System.out.println("This method is annotated.");
}
}
3. 处理自定义注解
使用反射可以在运行时访问和处理注解(还没学,暂时按下不表)
4. 常见元注解
-
@Target
:指定注解可以应用于哪些Java元素(类、方法、字段等)。-
常量对象:
TYPE
:用于类、接口(包括注解类型)或枚举的声明。FIELD
:用于字段的声明,包括枚举常量。METHOD
:用于方法的声明。PARAMETER
:用于方法参数的声明。CONSTRUCTOR
:用于构造方法的声明。LOCAL_VARIABLE
:用于局部变量的声明。ANNOTATION_TYPE
:用于注解类型的声明。PACKAGE
:用于包的声明。TYPE_PARAMETER
(自Java 1.8引入):用于类型参数的声明,可以用于泛型类型。TYPE_USE
(自Java 1.8引入):用于任何类型的使用位置,例如作为类型的使用。
-
示例:
javaimport java.lang.annotation.ElementType; import java.lang.annotation.Target; @Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD}) // 可以应用于类、方法和字段 public @interface MyCustomAnnotation { String value() default "Default Value"; }
-
-
@Retention
:指定注解的生命周期,即注解在哪个阶段可用。-
RetentionPolicy常量:
RetentionPolicy.SOURCE
:注解仅在源代码中可用,编译时会被丢弃。RetentionPolicy.CLASS
:注解在编译后的字节码中可用,但运行时不可用。RetentionPolicy.RUNTIME
:注解在运行时可用,可以通过反射读取。
-
示例:
javaimport java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) // 该注解在运行时可用 public @interface MyRuntimeAnnotation { }
-
-
@Documented
:指示使用该注解的元素在使用javadoc工具生成文档时应包含在内。-
示例:
javaimport java.lang.annotation.Documented; @Documented public @interface MyDocumentedAnnotation { }
-
使用这个注解的元素在生成的文档中会被包含。
-
-
@Inherited
:允许子类继承父类的注解。仅适用于类注解。-
示例 :
javaimport java.lang.annotation.Inherited; @Inherited @interface MyInheritedAnnotation { } @MyInheritedAnnotation class Parent { } class Child extends Parent { } public class Main { public static void main(String[] args) { // 检查子类是否继承了父类的注解 if (Child.class.isAnnotationPresent(MyInheritedAnnotation.class)) { System.out.println("Child class inherits MyInheritedAnnotation from Parent."); } } }
-
总结
自定义注解提供了灵活性,可以用于各种目的,如配置、标记、文档生成等。通过结合反射,开发者可以在运行时读取并处理这些注解,从而实现更强大的功能。