获取泛型类的真实参数
获得某个类的泛型
package com;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import org.springframework.core.ResolvableType;interface Service2 {}class ABService2 implements Service2 {}public class TestGenericClass2 { private Service cdService; public static void main(String[] args) { //获取ABService2实现的第一个接口(从0开始计数) 即Service2 ParameterizedType parameterizedType = (ParameterizedType) ABService2.class.getGenericInterfaces()[0]; System.out.println(parameterizedType); //从Service2 获得第0个参数 即A Type genericType = parameterizedType.getActualTypeArguments()[0]; System.out.println(genericType); System.out.println("*************"); //下面的可以获得被aop代理之前的类型 //ClassUtils.getUserClass(myClass); ResolvableType resolvableType1 = ResolvableType.forClass(ABService2.class); Class c=resolvableType1.as(Service2.class).getGeneric(0).resolve(); Class d=resolvableType1.getInterfaces()[0].getGeneric(0).resolve(); System.out.println("c "+c); System.out.println("d "+d); //上面的c与d一样 说明resolvableType1.as(Service2.class)与resolvableType1.getInterfaces()[0] //是一样的 都是返回resolvableType1 实现的某个接口 System.out.println("__________"); }}
输出:
com.Service2
class com.A
*************
c class com.A
d class com.A
---------------
上面代码里,*************之前的是使用jdk的原始api,之后是使用spring为我们通过的泛型api
使用jdk原始的api,似乎有个问题,那就是如果,如果目标类是继承(
而不是实现)了某个泛型类,那就(似乎)没法获得参数类型了
(这个,我也不确定,如果诸位谁知道,麻烦告诉小弟一声)
package com;import org.springframework.core.ResolvableType;interface Service3 {}class ServiceImpl3 implements Service{}class C3 {}class D3 {}class CDService3 extends ServiceImpl {}public class TestGenericClass3 { public static void main(String[] args) { ResolvableType resolvableType1 = ResolvableType.forClass(CDService3.class); Class c=resolvableType1.as(ServiceImpl.class).getGeneric(0).resolve(); System.out.println("c "+c); }}
输出
c class com.C3
***********
获得成员变量的泛型类型
package com;import org.springframework.core.ResolvableType;import org.springframework.util.ReflectionUtils;interface Service4 {}class ServiceImpl4 implements Service{}class C4 {}class D4 {}class CDService4 extends ServiceImpl4 {}public class TestGenericClass4 { private Service cdService; public static void main(String[] args) { ResolvableType resolvableType2 = ResolvableType.forField(ReflectionUtils.findField(TestGenericClass.class, "cdService")); System.out.println(resolvableType2.getGeneric(0).resolve()); }}
输出:
class com.C
在含泛型的父类中,获得子类的参数
说的很模糊,大家看代码:
package com;import org.springframework.core.ResolvableType;import org.springframework.util.ClassUtils;interface Service {}class ServiceImpl implements Service{ private Class> entityN; private Class> entityM; public ServiceImpl(){ System.out.println("this is "+this.getClass()); //用于避过aop 获得原始的类型 Class> childClass=ClassUtils.getUserClass(this.getClass()); if (childClass.equals(this.getClass())) { System.out.println("一样"); } ResolvableType resolvableType1 = ResolvableType.forClass(childClass); entityN=resolvableType1.as(ServiceImpl.class).getGeneric(0).resolve(); entityM=resolvableType1.as(ServiceImpl.class).getGeneric(1).resolve(); System.out.println(entityN+" ** "+entityM); }}class A {}class B {}class ABService extends ServiceImpl {}public class TestGenericClass { public static void main(String[] args) { Service abService= (Service) new ABService(); System.out.println("************* "+abService); }}
输出
this is class com.ABService
一样
class com.A ** class com.B
************* com.ABService@3358fd70
关于更多的泛型资料,请见参考资料
顺便多说一句,开涛哥真牛。
感谢glt。
参考资料
http://jinnianshilongnian.iteye.com/blog/1993608
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
暂时没有评论,来抢沙发吧~