【问题标题】:How do I get a Class object from a compiled type?如何从编译类型中获取 Class 对象?
【发布时间】:2015-02-05 17:43:07
【问题描述】:

我正在使用 Java 6。我有以下代码...

public abstract class AbstractHibernateDAO<T>
{
    ...   
    protected T find(final Serializable id)
    {
        T ret = null;
        if (id != null)
        {
            ret = m_entityManager.find(T, id);
        }   // if
        return ret;
    }

“ret = m_entityManager.find(T, id);”上存在编译时错误行,因为该方法的第一个参数应该是 java.lang.Class 对象,但是,我不知道如何在给定“T”编译时引用的情况下创建一个对象,或者即使这是可能的。任何帮助表示赞赏。

【问题讨论】:

  • 一般来说,由于类型擦除,您不能这样做。通常你会有一个接受Class&lt;T&gt; 的构造函数。我确定这是一个骗子,但我还没有找到相关的副本 - 会继续寻找。
  • “因为方法的第一个参数应该是 java.lang.Class 对象” T 无论如何都不会是 java.lang.Class 对象。你想要T.class,它也不会编译。
  • 如果发现重复项,请验证该解决方案是否适用于 Java 6。

标签: java class compile-time


【解决方案1】:

您可以像这样从类签名中提取类类型:

    public abstract class AbstractHibernateDAO<T> {
    private Class<T> persistentClass;

    public AbstractHibernateDAO() {
       this.persistentClass = (Class<T>)((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }

    protected T find(final Serializable id)
    {
        T ret = null;
        if (id != null)
        {
            ret = m_entityManager.find(persistentClass, id);
        }   // if
        return ret;
    }

【讨论】:

  • 嗨,ParameterizedType 类是 Java 7 构造,不是吗?我正在使用 Java 6。
  • 我收到异常,“构造函数抛出异常;嵌套异常是 java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType”行内构造函数。
  • 从头开始,我的错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 2022-08-22
  • 2013-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多