面试题答案
一键面试处理类型擦除影响的方法及代码示例
在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序列化器。不同类型的对象可能有不同的序列化规则。可以使用泛型注解标记需要序列化的类,并指定其类型。这样在序列化时,根据注解中的类型信息来选择合适的序列化策略。
解决类型擦除后丢失类型信息的问题
- 传递类型信息:如上述代码示例,通过在注解中传递
Class<T>
类型对象,运行时可以获取到具体类型。 - 使用反射:利用反射机制,在运行时根据获取的类型信息调用相应的方法、构造对象等。如示例中通过反射调用
String.valueOf
方法。