1、通过接口类型stringConsumer的class是没有泛型T的
2、应该从匿名内部类的class(也就是实现类)获取:解决办法1)自己实现接口2)通过lambda生成的匿名类class对象获取
/**
* 拿泛型的T 类型
* interface Consumer<T>
* @when 2019/4/18 20:32
**/
Consumer<String> stringConsumer= (String s)->{System.out.println(s);
System.out.println(this.getClass());};
// Consumer<java8Test.Apple> stringConsumer=System.out::println;
Class s=stringConsumer.getClass();
stringConsumer.accept("11");
// 获取当前new的对象的泛型的父类类型
Type Type=stringConsumer.getClass().getGenericSuperclass();
// ParameterizedType pt = (ParameterizedType) stringConsumer.getClass().getSuperclass().getGenericSuperclass();
// // 获取第一个类型参数的真实类型
// Class aa = (Class<?>) pt.getActualTypeArguments()[0];
// Method[] ss=stringConsumer.getClass().getMethods();
// Type []types=stringConsumer.getClass().getGenericInterfaces();
// Type type=stringConsumer.getClass().getGenericInterfaces()[0];
System.out.println(Type);
用1)自己实现接口方式实现
class classC implements Consumer<String>{
private Class<?> clazz;
// 使用反射技术得到T的真实类型
public Class getRealType(){
// 获取当前new的对象的泛型的父类类型
ParameterizedType pt = (ParameterizedType) super.getClass().getGenericSuperclass();
// 获取第一个类型参数的真实类型
this.clazz = (Class<?>) pt.getActualTypeArguments()[0];
return clazz;
}
@Override
public void accept(String s) {
}
public static void main(String[] args) {
Consumer<String> classB = new classC();
Class s=classB.getClass();
Method[] ss=classB.getClass().getMethods();
Type Type=classB.getClass().getGenericSuperclass();
ParameterizedType pt = (ParameterizedType) classB.getClass().getGenericSuperclass();
// Class realType = classB.getRealType();
// System.out.println(realType.getName());
System.out.println("");
}
}
本文探讨了在Java中如何通过反射技术获取泛型类型的实际类型参数,特别是针对Consumer接口的实现类。文章展示了两种方法:一是通过匿名内部类,二是自定义实现类。文中详细解释了如何使用ParameterizedType来获取泛型的实际类型。
693

被折叠的 条评论
为什么被折叠?



