JAVA 泛型 泛型的反射 泛型的实例化

JAVA 的泛型加大了 编程的灵活性,在配合上反射,可以让我们省去大量的重复代码,当你用 SpringBoot 整合 JPA 的时候

你会发现,你的 DAO 层只需要继承 BaseDao,在显示标明泛型的时候,你定义的接口就可以有一些常用的增删改查的方法

笔者也想实现的类似的功能,但是在使用泛型的时候发现 T.calss 的语法是不成立的,这涉及到JVM虚拟机对于泛型的擦除,

我们要怎么样拿到 T 这个泛型的字节码和实例呢?

1,其实 JDK 给我们提供了相应的方法如下:

Type type = this.getClass().getGenericSuperclass();
Type[] typeArr = ((ParameterizedType) type).getActualTypeArguments();
Class<T> mtClass = (Class<T>) (typeArr[0]);

2,以上代码我们就获得了 T 这个泛型在运行时的类型了,有了字节码,实例化,获取字段,获取注解什么的就不在话下了

3,需要注意的是,只有满足以下的申明方式,在父类 A 中才能正常使用以上方法

class A<T> {}

class B extends A<User>{}

5,这就导致我们对每个类进行操作是都需要创建一个对应的类来继承A类,好处就在于子类不需要写任何代码,

6,不知道 JDK 什么时候能实现 T.class 的功能就好了 (个人浅见,补习勿喷)

猜你喜欢

转载自www.cnblogs.com/lovling/p/9995701.html