1.注解简介
注解(Annotation)是Java5引入的一种元数据机制,用于为代码提供额外的信息。注解可以用于类、方法、字段、参数等元素上,编译器、工具和框架可以通过反射读取注解信息并进行相应的处理。
2.内置注解
Java提供了一些内置注解,常用的有:
- @Override:表示方法重写父类的方法。
- @Deprecated:表示方法或类已过时,不推荐使用。
- @SuppressWarnings:抑制编译器警告。
2.1使用内置注解
class Parent {
void display() {
System.out.println("Parent display");
}
}
class Child extends Parent {
@Override
void display() {
System.out.println("Child display");
}
@Deprecated
void oldMethod() {
System.out.println("This method is deprecated");
}
@SuppressWarnings("unchecked")
void uncheckedWarning() {
java.util.List list = new java.util.ArrayList();
list.add("Hello");
}
}
public class Main {
public static void main(String[] args) {
Child child = new Child();
child.display();
child.oldMethod();
child.uncheckedWarning();
}
}3.自定义注解
Java允许用户自定义注解。自定义注解使用@interface关键字定义,可以包含元素(类似于方法)。
3.1定义注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
String value() default "default value";
int number() default 0;
}3.2使用注解
public class Main {
@MyAnnotation(value = "custom value", number = 10)
public void myMethod() {
System.out.println("Executing myMethod");
}
public static void main(String[] args) {
Main main = new Main();
main.myMethod();
}
}4.注解处理器
通过反射机制,可以在运行时读取注解信息并进行相应的处理。
4.1读取注解信息
import java.lang.reflect.Method;
public class Main {
@MyAnnotation(value = "custom value", number = 10)
public void myMethod() {
System.out.println("Executing myMethod");
}
public static void main(String[] args) {
try {
Main main = new Main();
Method method = main.getClass().getMethod("myMethod");
// 读取注解信息
MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
if (annotation != null) {
System.out.println("Value: " + annotation.value());
System.out.println("Number: " + annotation.number());
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}5.元注解
元注解是用于注解其他注解的注解。Java提供了以下几种元注解:
- @Retention:指定注解的保留策略(SOURCE、CLASS、RUNTIME)。
- @Target:指定注解可以应用的目标元素(TYPE、METHOD、FIELD等)。
- @Documented:指定注解是否包含在JavaDoc中。
- @Inherited:指定注解是否可以被继承。
5.1使用元注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
String value() default "default value";
int number() default 0;
}
7.示例代码
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface TestAnnotation {
String name();
int priority() default 1;
}
public class Main {
@TestAnnotation(name = "testMethod", priority = 2)
public void testMethod() {
System.out.println("Executing testMethod");
}
@SuppressWarnings("unchecked")
public void uncheckedWarning() {
java.util.List list = new java.util.ArrayList();
list.add("Hello");
}
public static void main(String[] args) {
try {
Main main = new Main();
Method method = main.getClass().getMethod("testMethod");
// 读取注解信息
TestAnnotation annotation = method.getAnnotation(TestAnnotation.class);
if (annotation != null) {
System.out.println("Name: " + ());
System.out.println("Priority: " + annotation.priority());
}
main.uncheckedWarning();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}8.总结
今天的内容涵盖了Java注解的基本概念和常用技术,包括内置注解、自定义注解、注解处理器和元注解。注解是Java编程中非常强大的工具,务必熟练掌握。明天我们将深入学习Java的Lambda表达式和函数式编程。
提示:多动手编写代码,尝试使用注解解决实际问题,理解注解的工作原理和适用场景。
祝你学习愉快!
















