获取泛型类的真实参数

网友投稿 976 2022-11-06

获取泛型类的真实参数

获取泛型类的真实参数

获得某个类的泛型

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小时内删除侵权内容。

上一篇:Struts2中的缓存----以Injector为例
下一篇:常用js总结
相关文章

 发表评论

暂时没有评论,来抢沙发吧~