面试题答案
一键面试1. 自定义注解
在Java中,自定义注解需要使用 @interface
关键字。以下是自定义注解的一般步骤:
- 使用
@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, ElementType.FIELD})
public @interface MyAnnotation {
// 定义一个成员变量,默认值为 "default value"
String value() default "default value";
}
2. 通过反射获取使用该注解的类、方法或字段信息
通过反射获取注解信息的步骤如下:
- 获取类的
Class
对象。 - 使用
Class
对象的方法获取注解信息,例如getAnnotation
方法获取类上的注解,getMethod
方法获取方法对象后再通过方法对象获取方法上的注解,getField
方法获取字段对象后再通过字段对象获取字段上的注解。
示例代码如下:
public class AnnotationExample {
@MyAnnotation("class annotation value")
public static class MyClass {
@MyAnnotation("field annotation value")
private String myField;
@MyAnnotation("method annotation value")
public void myMethod() {
// 方法体
}
}
public static void main(String[] args) {
// 获取类的注解
MyAnnotation classAnnotation = MyClass.class.getAnnotation(MyAnnotation.class);
if (classAnnotation != null) {
System.out.println("Class annotation value: " + classAnnotation.value());
}
try {
// 获取方法的注解
java.lang.reflect.Method method = MyClass.class.getMethod("myMethod");
MyAnnotation methodAnnotation = method.getAnnotation(MyAnnotation.class);
if (methodAnnotation != null) {
System.out.println("Method annotation value: " + methodAnnotation.value());
}
// 获取字段的注解
java.lang.reflect.Field field = MyClass.class.getDeclaredField("myField");
MyAnnotation fieldAnnotation = field.getAnnotation(MyAnnotation.class);
if (fieldAnnotation != null) {
System.out.println("Field annotation value: " + fieldAnnotation.value());
}
} catch (NoSuchMethodException | NoSuchFieldException e) {
e.printStackTrace();
}
}
}
上述代码中,首先定义了一个 MyAnnotation
注解,然后在 MyClass
类、myField
字段和 myMethod
方法上使用了该注解。最后在 main
方法中通过反射获取并打印了类、方法和字段上的注解值。