MST

星途 面试题库

面试题:自定义泛型注解中的类型擦除处理及应用场景

如果要创建一个自定义的泛型注解,例如@MyAnnotation<T>,在使用这个注解时,如何处理类型擦除带来的影响?给出具体的代码示例,并阐述这种自定义泛型注解在实际项目中的一个可能应用场景,以及如何通过代码解决类型擦除后可能丢失的类型信息问题。
31.2万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

处理类型擦除影响的方法及代码示例

在Java中,虽然运行时存在类型擦除,但可以通过反射和额外的类型信息传递来处理。

首先定义泛型注解:

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)
public @interface MyAnnotation<T> {
    Class<T> value();
}

然后定义使用该注解的类:

@MyAnnotation(String.class)
public class MyClass {
}

在运行时获取注解并处理类型信息:

import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class AnnotationProcessor {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        AnnotatedElement annotatedElement = MyClass.class;
        MyAnnotation annotation = annotatedElement.getAnnotation(MyAnnotation.class);
        Class<?> clazz = annotation.value();
        Method method = clazz.getMethod("valueOf", String.class);
        Object result = method.invoke(null, "test");
        System.out.println(result);
    }
}

实际项目应用场景

在数据序列化/反序列化框架中,比如自定义的JSON序列化器。不同类型的对象可能有不同的序列化规则。可以使用泛型注解标记需要序列化的类,并指定其类型。这样在序列化时,根据注解中的类型信息来选择合适的序列化策略。

解决类型擦除后丢失类型信息的问题

  1. 传递类型信息:如上述代码示例,通过在注解中传递Class<T>类型对象,运行时可以获取到具体类型。
  2. 使用反射:利用反射机制,在运行时根据获取的类型信息调用相应的方法、构造对象等。如示例中通过反射调用String.valueOf方法。