【java】如何通过反射获取泛型类

核心代码:(编写在父类中)

public class BaseDaoImpl<T> implements BaseDao<T> {
    private Class<T> beanClass;
    
    @SuppressWarnings("unchecked")
    public BaseDaoImpl() {
        ParameterizedType parameterizedType=(ParameterizedType)this.getClass().getGenericSuperclass();
        beanClass=(Class<T>) parameterizedType.getActualTypeArguments()[0];
    }
    // 省略具体的操作....
}

应用场景:

目标:为了实现代码的重用性,编写了父类接口BaseDao和父类方法BaseDaoImpl,想用BaseDaoImpl类实现操作数据库共有的增删改查。

问题:因此父类方法必须用到泛型,以保证所有数据库不同的表都能够被操作。所以子类在编写sql语句的时候(继承父类方法,只需要提供表名即可),为了简单,我们希望拿到泛型的名称。

比如说:UserDaoImpl为了获取数据库中所有的User,为了重用,父类方法应该考虑到子类使用方便,因此编写以上代码,父类需要拿到T泛型的类名。比如以下代码是编写在BaseDaoImpl中的:

        public List<T> getAll(String param)  {
		String sql="delete from "+beanClass.getSimpleName()+" "+param;
		
		System.out.println(sql);
		// 添加执行此sql语句的代码,并且作为返回值
		return null;
	}

也就是说这个时候,子类(比如说UserImpl类)继承BaseDaoImpl的时候注意填写泛型为对应的表名User就好了(当然其他表也一样)

public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao {

}

猜你喜欢

转载自blog.csdn.net/smileyan9/article/details/80796770