public BaseDAO() { //getClass() 获取Class对象,当前我们执行的是 //new FruitDAOImpl() 创建的是FruitDAOImpl的实例 //那么子类构造方法内部首先会调用父类(BaseDAO)的无参构造方法 //因此此处的getClass()会被执行,但是getClass获取的是FruitDAOImpl的Class //所以getGenericSuperclass()获取到的是BaseDAO的Class Type genericType=getClass().getGenericSuperclass(); //ParameterizedType参数化类型 Type[] actualTypeArguments=((ParameterizedType) genericType).getActualTypeArguments(); //获取到<T>中的T的真实的类型 Type actualType=actualTypeArguments[0]; try { entityClass = Class.forName(actualType.getTypeName()); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } }
时间: 2023-02-23 14:56:41 浏览: 56
这段代码是实现了一个通用的DAO类,称为BaseDAO。它的构造方法通过getClass()方法获取当前实例的Class对象,再通过getGenericSuperclass()方法获取父类的Class对象,从而得到实际的参数化类型(ParameterizedType),最终通过getActualTypeArguments()方法获取<T>中的T的真实类型,并用Class.forName()方法得到它的Class对象,存储在entityClass字段中。如果在过程中发生了ClassNotFoundException,就抛出一个RuntimeException。
相关问题
public class petDaoImpl extends BaseDao implements petDao
这段代码定义了一个名为 `petDaoImpl` 的 Java 类,它继承了 `BaseDao` 类并实现了 `petDao` 接口。
`petDaoImpl` 类可能是一个用于操作宠物信息的数据访问对象(Data Access Object,DAO)。`BaseDao` 类可能是一个通用的 DAO 基类,提供了一些常用的数据库操作方法,例如获取数据库连接、执行 SQL 语句等等。`petDao` 接口可能定义了一些用于操作宠物信息的方法,例如查询宠物信息、添加宠物信息、更新宠物信息等等。
`petDaoImpl` 类继承了 `BaseDao` 类,意味着它可以直接使用 `BaseDao` 类中的方法,而不需要再单独实现一遍。此外,`petDaoImpl` 类实现了 `petDao` 接口,它必须实现 `petDao` 接口中定义的所有方法,否则会编译错误。
通过将数据访问操作分离到 DAO 层,可以有效地降低业务逻辑和数据访问之间的耦合度,提高代码的可维护性和可扩展性。
我加入了这个规则,getClass().getGenericSuperclass() 获取到的类型还是Class
如果你在一个普通类中调用 `getClass().getGenericSuperclass()` 方法,它返回的类型是 `Type`。而如果你在一个泛型类中调用该方法,它返回的类型是 `ParameterizedType`。
如果你想获取到泛型超类的类型,你需要先将 `Type` 转换成 `ParameterizedType`,然后调用 `getActualTypeArguments()` 方法获取泛型参数的实际类型。例如:
```java
public abstract class BaseDao<T> {
private Class<T> entityClass;
public BaseDao() {
Type type = getClass().getGenericSuperclass();
ParameterizedType paramType = (ParameterizedType) type;
this.entityClass = (Class<T>) paramType.getActualTypeArguments()[0];
}
}
```
在上面的代码中,我们首先通过 `getClass().getGenericSuperclass()` 方法获取到当前类的超类的类型,然后将其强制转换成 `ParameterizedType` 类型。接着,我们调用 `getActualTypeArguments()` 方法,获取泛型参数的实际类型的数组,并通过 `[0]` 取得第一个泛型参数的实际类型,即为实体类的类型。最后,我们将实体类的类型保存到 `entityClass` 字段中。