java 获取泛型的属性_Java获取泛型的类型

Java的泛型是使用的擦除法实现,泛型的定义只在编译的时候有效,编译之后是没有保留泛型的类型信息的。

然而,擦除法的实现存在一些特列,在这些特例情况下,Java会记录泛型的类型信息,并且可以通过反射的Api来获取。

一)泛型继承

public class TypeTest {

public static void main(String[] args) {

doProxy(Lists.newArrayList(1), new Function() {

public List execute(Integer request) {

return Lists.newArrayList(String.valueOf(request));

}

});

}

//必须是class,interface获取不到泛型

abstract static class Function {

abstract List execute(F request);

}

public static List doProxy(List request, Function function) {

if (function.getClass().getGenericSuperclass() instanceof ParameterizedType) {

Type mySuperClass = function.getClass().getGenericSuperclass();

Type type = ((ParameterizedType) mySuperClass).getActualTypeArguments()[0];

System.out.println(type);

System.out.println(((ParameterizedType) mySuperClass).getActualTypeArguments()[1]);

}

List list = Lists.newArrayList();

for (F f : request) {

list.addAll(function.execute(f));

}

return list;

}

}

二)方法参数和返回值的泛型

因为需要先通过反射获取Method对象,而反射获取Method对象需要方法名和参数类型,所以

只能获取List method(Set param),这种参数的泛型

不能获取T method(T param),这种参数的泛型

method.getGenericParameterTypes()[0].getActualTypeArguments()[0]

method.getGenericReturnType().getActualTypeArguments()[0]

三)Field的泛型

同方法泛型的原因

只能获取List field,这种属性的泛型

不能获取T field这种属性的泛型

field.getGenericType().getActualTypeArguments()[0]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值