面试题答案
一键面试- 定义自定义注解:
- 使用
@interface
关键字定义注解。例如:
public @interface MyAnnotation { // 注解可以有成员变量,这里定义一个字符串类型的成员变量 String value() default ""; }
- 使用
- 使用元注解:
@Retention
:用于指定注解的保留策略。有三个取值:RetentionPolicy.SOURCE
:注解只保留在源文件,编译时就会被丢弃。RetentionPolicy.CLASS
:注解保留在class文件中,但运行时JVM不会保留,这是默认值。RetentionPolicy.RUNTIME
:注解不仅被保存到class文件中,在运行时JVM也会保留,可以通过反射获取该注解信息。例如:
import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { String value() default ""; }
@Target
:用于指定注解可以应用的目标元素类型。取值包括:ElementType.TYPE
:类、接口(包括注解类型)或枚举声明。ElementType.FIELD
:字段声明(包括枚举常量)。ElementType.METHOD
:方法声明。ElementType.PARAMETER
:参数声明。ElementType.CONSTRUCTOR
:构造函数声明。- 等等。例如,只想让注解用于方法上:
import java.lang.annotation.ElementType; import java.lang.annotation.Target; @Target(ElementType.METHOD) public @interface MyAnnotation { String value() default ""; }
@Documented
:表示该注解会被包含在JavaDoc中。@Inherited
:表示如果一个类使用了被@Inherited
修饰的注解,那么这个类的子类也会继承该注解(仅针对类上的注解有效)。
- 配合Lombok进行代码生成:
- 首先确保项目中引入了Lombok依赖。例如在Maven项目中,可以在
pom.xml
中添加:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.24</version> <scope>provided</scope> </dependency>
- 自定义一个处理器来配合Lombok。假设我们希望在使用自定义注解的类中自动生成一个方法。
- 定义自定义注解:
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.SOURCE) @Target(ElementType.TYPE) public @interface GenerateMethodAnnotation { String methodName() default "generatedMethod"; }
- 编写一个Lombok处理器(这里是简化示例,实际可能更复杂)。需要继承
AbstractProcessor
:
import javax.annotation.processing.*; import javax.lang.model.SourceVersion; import javax.lang.model.element.TypeElement; import java.util.Set; @SupportedAnnotationTypes("GenerateMethodAnnotation") @SupportedSourceVersion(SourceVersion.RELEASE_8) public class GenerateMethodProcessor extends AbstractProcessor { @Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { for (TypeElement annotation : annotations) { for (Element element : roundEnv.getElementsAnnotatedWith(annotation)) { // 这里可以根据注解信息生成代码,例如生成方法 // 实际使用需要更复杂的代码生成逻辑,这里简单打印 GenerateMethodAnnotation generateMethodAnnotation = element.getAnnotation(GenerateMethodAnnotation.class); System.out.println("Generating method " + generateMethodAnnotation.methodName() + " for class " + element.getSimpleName()); } } return true; } }
- 在
resources/META-INF/services
目录下创建文件javax.annotation.processing.Processor
,内容为处理器的全限定名:
com.example.GenerateMethodProcessor
- 使用注解:
@GenerateMethodAnnotation(methodName = "customGeneratedMethod") public class MyClass { // 在这里,Lombok处理器会根据注解生成相应的方法(逻辑在处理器中实现) }
- 首先确保项目中引入了Lombok依赖。例如在Maven项目中,可以在
这样,通过上述步骤,就可以在Java中自定义注解并配合Lombok进行代码生成。