面试题答案
一键面试自定义注解步骤:
- 定义注解:使用
@interface
关键字定义注解。注解可以包含成员变量(以无参数方法形式定义),这些成员变量可以有默认值。例如:
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.TYPE, ElementType.METHOD})
public @interface MyAnnotation {
String value() default "";
int number() default 0;
}
@Retention
指明注解的保留策略,RetentionPolicy.RUNTIME
表示运行时保留,这样在运行时可以通过反射获取到注解信息。@Target
指明注解可以应用的目标,如ElementType.TYPE
表示可以用于类、接口等,ElementType.METHOD
表示可以用于方法。
- 使用注解:在类或方法上使用自定义注解。例如:
@MyAnnotation(value = "TestClass", number = 1)
public class MyClass {
@MyAnnotation(value = "TestMethod", number = 2)
public void myMethod() {
// 方法体
}
}
通过反射获取使用该注解的类及方法:
import java.lang.reflect.Method;
public class AnnotationReflection {
public static void main(String[] args) {
// 获取类上的注解
if (MyClass.class.isAnnotationPresent(MyAnnotation.class)) {
MyAnnotation classAnnotation = MyClass.class.getAnnotation(MyAnnotation.class);
System.out.println("类上的注解值: " + classAnnotation.value());
System.out.println("类上的注解数字: " + classAnnotation.number());
}
// 获取方法上的注解
try {
Method method = MyClass.class.getMethod("myMethod");
if (method.isAnnotationPresent(MyAnnotation.class)) {
MyAnnotation methodAnnotation = method.getAnnotation(MyAnnotation.class);
System.out.println("方法上的注解值: " + methodAnnotation.value());
System.out.println("方法上的注解数字: " + methodAnnotation.number());
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
通过上述反射代码,可以获取到类和方法上使用的自定义注解,并访问注解中的成员变量值。