Java获取泛型的类型Class

今天搭建框架的时候,要获取泛型<T>的Class具体例子:

@EnableTransactionManagement
@Transactional
@Repository
public class BasicDAO<T> extends HibernateDaoSupport {
    //实体类
    private T entity;
    private Class<T> entityClass;

    public BasicDAO() {
        //通过反射机制获取泛型的类类型
        entityClass = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }

    public BasicDAO(T entity) {
        this.entity = entity;
    }

    public void save(T entity){
        try {
            getHibernateTemplate().save(entity);
        } catch (DataAccessException e) {
            e.printStackTrace();
        }
    }

    public void update(T entity){
        try {
            getHibernateTemplate().update(entity);
        } catch (DataAccessException e) {
            e.printStackTrace();
        }
    }

    public void delete(T entity){
        Assert.assertNotNull(entity);
        try {
            getHibernateTemplate().delete(entity);
        } catch (DataAccessException e) {
            e.printStackTrace();
        }
    }

    /**
     * 具体主键,返回实体
     * @return id
     */
    public T getModel(int id){
        //通过反射机制获取去实体模型
      return getHibernateTemplate().get(entityClass,id);
    }

    /**
     * 自动注入SessionFactory
     * @param sessionFactory
     */
    @Autowired
    public void setupSessionFactory(final SessionFactory sessionFactory) {
        this.setSessionFactory(sessionFactory);
    }
}

若要在公用类中,要得到实体entity对象【见BaseDAO.java的getModel(int)方法】,光有主键还不够,session还得知道实体的类类型,及BaseAction中的entityClass才行。

如何获得呢?见【构造函数BasicDAO()】

下面为另外一篇博客写的例子:

public class Test<T> {
    public T newInstance(){
        T instance=null;
        Class<T> entityClass = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
//      ……
        return instance;
    };
}

博客地址:http://www.tashan10.com/tong-guo-fan-she-huo-qu-fan-xing-de-class/

另外若是通过获得调用类的类类型改怎么办呢?经典的场景为日志管理。

Java反射机制可以实现上面的诉求

public class LoggerUtils {
    private static Logger logger ;

    public static Logger getLogger() {
        if(logger == null){
            //Java8 废弃了Reflection.getCallerClass()
            logger= Logger.getLogger(Reflection.getCallerClass());
        }
        return logger;
    }
}
时间: 2024-07-28 15:58:53

Java获取泛型的类型Class的相关文章

java获取获得Timestamp类型的当前系统时间

java获取取得Timestamp类型的当前系统时间java获取取得Timestamp类型的当前系统时间 格式:2010-11-04 16:19:42 方法1: Timestamp d = new Timestamp(System.currentTimeMillis()); 方法2: Date date = new Date(); Timestamp nousedate = new Timestamp(date.getTime()); -----------------------------下

java获取泛型的实际类型

这是一个困扰了我好久的问题,在我写的android请求框架总结(二)中写到过利用框架自动解析json数据,代码如下 Object o; if (result.charAt(0) == '{') { //解析对象 o = new Gson().fromJson(result, clazz); } else { //这个方法是在stackoverflow中找到的可将json转换为list,普通的通过type去解析是不行的 o = new Gson().fromJson(result, com.goo

利用ParameterizedType获取泛型参数类型

//利用ParameterizedType获取java泛型的参数类型 public class Demo { public static void main(String[] args) { classTest(); interfaceTest(); } private static void classTest() { MySuperClass<Student, String> mySuperClass = new MySuperClass<Student, String>() 

java获取对象属性类型、属性名称、属性值

因为项目需要用到,于是简单封装了一些常用的操作: [java] view plaincopy /** * 根据属性名获取属性值 * */ private Object getFieldValueByName(String fieldName, Object o) { try { String firstLetter = fieldName.substring(0, 1).toUpperCase(); String getter = "get" + firstLetter + field

Java获取泛型的Class对象

工作中瞄到的,在此收集了 [java] view plain copy public class RawDao<T> { protected Class<T> clazz; @SuppressWarnings("unchecked") public RawDao() { @SuppressWarnings("rawtypes") Class clazz = getClass(); while (clazz != Object.class) {

Java获取泛型 Class

//得到泛型的Class private Class<T> entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 原文地址:https://www.cnblogs.com/sdu-Jumper/p/12031997.html

Java获取文件的类型(扩展名)

File file=new File("E:\\aa.jpg"); String fileName=file.getName(); String fileTyle=fileName.substring(fileName.lastIndexOf("."),fileName.length()); System.out.println(fileTyle); 程序运行效果图:

通过Gson获取泛型的类型

代码片段:     static Type getSuperclassTypeParameter(Class<?> subclass)     {         Type superclass = subclass.getGenericSuperclass();         if (superclass instanceof Class)         {             throw new RuntimeException("Missing type paramet

java 反射和泛型-反射来获取泛型信息

通过指定对应的Class对象,程序可以获得该类里面所有的Field,不管该Field使用private 方法public.获得Field对象后都可以使用getType()来获取其类型. Class<?> type = f.getType();//获得字段的类型 但此方法只对普通Field有效,若该Field有泛型修饰,则不能准确得到该Field的泛型参数,如Map<String,Integer>; 为了获得指定Field的泛型类型,我们采用: Type gType = f.getG