获取泛型类的真实参数
来源:互联网 发布:三阶矩阵的模怎么求 编辑:程序博客网 时间:2024/05/16 15:58
获得某个类的泛型
package com;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import org.springframework.core.ResolvableType;interface Service2<N, M> {}class ABService2 implements Service2<A, B> {}public class TestGenericClass2 {private Service<C, D> cdService;public static void main(String[] args) {//获取ABService2实现的第一个接口(从0开始计数) 即Service2<A, B>ParameterizedType parameterizedType = (ParameterizedType) ABService2.class.getGenericInterfaces()[0];System.out.println(parameterizedType);//从Service2<A, B> 获得第0个参数 即AType 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<com.A, com.B>
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<N, M> {}class ServiceImpl3<N,M> implements Service<N, M>{}class C3 {}class D3 {}class CDService3 extends ServiceImpl<C3, D3> {}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<N, M> {}class ServiceImpl4<N,M> implements Service<N, M>{}class C4 {}class D4 {}class CDService4 extends ServiceImpl4<C4, D4> {}public class TestGenericClass4 {private Service<C, D> 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<N, M> {}class ServiceImpl<N,M> implements Service<N, M>{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<A, B> {}public class TestGenericClass {public static void main(String[] args) {Service<A, B> abService= (Service<A, B>) 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 0 0
- 获取泛型类的真实参数
- 获取真实的需求
- 获取真实的IP地址
- 获取字符串的真实长度
- 获取来访者的真实IP
- 获取真实的IP地址
- 网卡真实的物理地址获取
- 获取客户端的真实ip
- 获取真实的客户IP
- 获取div的真实宽度
- 获取客户端真实的ip
- 获取更为真实的用户信息
- JAVA获取真实的文件类型
- 获取用户的真实ip
- 获取客户端的真实ip
- 如何使用反射技术获取泛型类的真实类型?
- 如何使用反射技术获取泛型类的真实类型?
- 如何使用反射技术获取泛型类的真实类型
- Collection集合总结
- 引论
- C++ bitset类的使用与简介
- c++连接postgresql
- Count Primes 筛选法求素数
- 获取泛型类的真实参数
- java.lang.IllegalArgumentException: Mapped Statements collection already contains value for
- LibRTMP源代码分析5:建立网络连接
- 统一设计,iOS6也玩扁平化
- android事件传递机制的详细了解
- ListView
- 使用xib的适配方法
- 深入理解计算机系统重点笔记
- EXP-00056: 遇到 ORACLE 错误 1455