提示信息

Java高级应用之通过反射操作泛型

祁久 已关注

在Java中,可以使用反射来操作泛型。通过反射,可以获取泛型的类型信息,以及动态创建泛型对象。

在Java中,泛型是编译时类型擦除的,即在编译时会将泛型的类型信息擦除,转换成普通的Object类型。但是通过反射,可以在运行时获取泛型的类型信息。

下面是一个示例代码,演示如何通过反射操作泛型:

  1. import java.lang.reflect.ParameterizedType;
  2. import java.lang.reflect.Type;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. public class GenericReflectionDemo<T> {
  6. private T value;
  7. public GenericReflectionDemo(T value) {
  8. this.value = value;
  9. }
  10. public T getValue() {
  11. return value;
  12. }
  13. public static void main(String[] args) {
  14. // 创建一个带有泛型参数的List对象
  15. List<String> list = new ArrayList<String>();
  16. // 通过反射获取List的类型信息
  17. Type type = list.getClass().getGenericSuperclass();
  18. if (type instanceof ParameterizedType) {
  19. ParameterizedType parameterizedType = (ParameterizedType) type;
  20. Type[] typeArguments = parameterizedType.getActualTypeArguments();
  21. if (typeArguments.length > 0) {
  22. // 获取泛型参数的类型信息
  23. Type typeArgument = typeArguments[0];
  24. System.out.println("泛型参数类型: " + typeArgument.getTypeName());
  25. }
  26. }
  27. // 创建一个带有泛型参数的对象
  28. GenericReflectionDemo<String> demo = new GenericReflectionDemo<String>("Hello");
  29. // 通过反射获取对象的类型信息
  30. Type objectType = demo.getClass().getGenericSuperclass();
  31. if (objectType instanceof ParameterizedType) {
  32. ParameterizedType parameterizedType = (ParameterizedType) objectType;
  33. Type[] typeArguments = parameterizedType.getActualTypeArguments();
  34. if (typeArguments.length > 0) {
  35. // 获取泛型参数的类型信息
  36. Type typeArgument = typeArguments[0];
  37. System.out.println("泛型参数类型: " + typeArgument.getTypeName());
  38. }
  39. }
  40. }
  41. }

运行结果:

  1. 泛型参数类型: java.lang.String
  2. 泛型参数类型: java.lang.String

通过反射,我们可以获取List对象的泛型参数类型为String,以及使用泛型实例化对象的泛型参数类型也为String。这样我们就可以在运行时获取泛型的类型信息,并做出相应的操作。

    遇到难题? "AI大模型GPT4.0、GPT" 是你的私人解答专家! 点击按钮去提问......
祁久 关注 已关注

最近一次登录:2023-10-09 13:12:16   

暂时还没有签名,请关注我或评论我的文章
×
免费图表工具,画流程图、架构图