疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java获取泛型类型


 

     Java获取泛型类型方法:
 
    通常获取泛型的类型名称,然后组装,再根据这个名称从spring容器拿到一个Bean;比如
 
    [java]
 
    @Service("baseService")
 
    public class BaseService<T>  implements BaseMapper<T>{
 
    private String mapper;
 
    @Override
 
    public int insert(T t) {
 
    BaseMapper<T> baseMapper= (BaseMapper) SysConfigHelper.getAppContext()。getBean(t.getClass()。getSimpleName()。toLowerCase()+"Mapper");
 
    return baseMapper.insert(t);
 
    }
 
    }
 
    像上面的T一样,可以拿到T的类型值为 User
 
    即 t.getClass()。getSimpleName()。toLowerCase()+"Mapper" 的结果为【userMapper】
 
    但是delete方法的时候,这种方式却是不行的
 
    [java]
 
    <pre name="code" class="java">  @Override
 
    public int deleteById(int id) {
 
    T t = null;
 
    BaseMapper<T> baseMapper= (BaseMapper) SysConfigHelper.getAppContext()。getBean(t.getClass()。getSimpleName()。toLowerCase()+"Mapper");
 
    return baseMapper.deleteById(id);
 
    }</pre>
 
    这样写会抛异常,因为t是为nul
 
    我们可以这些写
 
    [java]
 
    @Override
 
    public int update(T t) {
 
    Type type = getClass()。getGenericSuperclass();
 
    Type trueType = ((ParameterizedType) type)。getActualTypeArguments()[0];
 
    Class<T> entityClass=(Class<T>) trueType;
 
    System.out.println(type);
 
    System.out.println(trueType);
 
    System.out.println(entityClass.getSimpleName());
 
    BaseMapper<T> baseMapper= (BaseMapper) SysConfigHelper.getAppContext()。getBean(entityClass.getSimpleName()。toLowerCase()+"Mapper");
 
    return baseMapper.update(t);
 
    }
 
    控制台打印的结果为:
 
    [java]
 
    com.zte.framework.jdbc.BaseService<com.zte.user.domain.User>
 
    class com.zte.user.domain.User
 
    User
 
    这样就拿到了泛型T的类型了;值为【User】