获取带泛型父类的泛型字节码_徐川江的博客_新浪博客

本文介绍了一种在Java中使用泛型和反射的方法来确定类的实例化过程中的实际类型参数。通过一个具体的BaseDaoImpl类示例,展示了如何获取泛型化的超类的实际类型参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

private Classclazz;

public BaseDaoImpl(){//父类的构造方法

    //this.getClass()得到的是子类

    //得到的泛型化的超类(含有泛型的子类),ParameterizedType来接收

    ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();

  //getActualTypeArguments得到泛型的字节码,可能有多个泛型所以在这里加上[0]

    clazz = (Class) type.getActualTypeArguments()[0];

    }

### 如何在Java获取父类Class对象 为了获得父类的`Class`对象,在Java中有几种不同的方式可以实现这一目标。一种常见的方式涉及使用反射机制中的`getGenericSuperclass()`方法来访问父类信息,进而提取具体的参数。 当尝试从子实例化过程中捕获并传递的实际参数给父类时,可以通过以下代码片段展示具体操作: ```java // 假设有一个父类 Base<T> public class Base<T> { private Class<T> type; public Base(Class<T> type) { this.type = type; } protected void printType() { System.out.println(type); } } // 定义一个继承自Base<String>的具体子 SubString public static class SubString extends Base<String> { // 构造函数调用super传入String.class作为type参数 public SubString() { super(String.class); // 显式提供的实际 } } ``` 上述例子展示了如何显式地向父类构造器传递的实际[^1]。然而,如果希望自动推断而不是手动指定,则可采用另一种基于反射的方法: ```java import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; public abstract class GenericHelper<T> { @SuppressWarnings("unchecked") protected final Class<T> clazz; protected GenericHelper(){ Type superclass = getClass().getGenericSuperclass(); if(superclass instanceof ParameterizedType){ ParameterizedType parameterizedType = (ParameterizedType) superclass; Type[] actualTypes = parameterizedType.getActualTypeArguments(); if(actualTypes.length > 0 && actualTypes[0] instanceof Class<?>){ clazz = (Class<T>)actualTypes[0]; }else{ throw new RuntimeException("无法解析"); } }else{ throw new RuntimeException("未找到"); } } } ``` 这段代码利用了`getClass().getGenericSuperclass()`返回的对象,并将其转换为`ParameterizedType`以便能够调用`getActualTypeArguments()`方法来获取真实的参数[^4]。 对于某些复杂场景下可能还需要考虑更多细节处理,比如多层嵌套等情况下的适配问题。但是以上两种基本模式已经覆盖了许多常见的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值