Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过反射在运行时获取通用字段类型_Java_Reflection - Fatal编程技术网

Java 通过反射在运行时获取通用字段类型

Java 通过反射在运行时获取通用字段类型,java,reflection,Java,Reflection,我无法通过MyClass的反射访问id的运行时类型 public abstract class AbstractEntity<T> { @Id private T id; //I need to access the runtime class of T } public class MyClass extends AbstractEntity<Long> {} 然后,我过滤这个列表中带有@Id注释的字段,其中应该只有一个字段。泛型在运行时没有具

我无法通过
MyClass
的反射访问
id
的运行时类型

public abstract class AbstractEntity<T> {

    @Id
    private T id; //I need to access the runtime class of T

}

public class MyClass extends AbstractEntity<Long> {} 
然后,我过滤这个列表中带有
@Id
注释的字段,其中应该只有一个字段。

泛型在运行时没有具体化。这意味着信息在运行时不存在

一种方法是知道泛型参数化类型的类类型,即
类entityClass

public abstract class AbstractEntity<T> {

    @Id
    private T id; //I need to access the runtime class of T

}

public class MyClass extends AbstractEntity<Long> {} 
有两种方法可以实现这一点。您可以使用默认构造函数并以反射方式获取类类型:

this.entityClass= (Class<T>) ((ParameterizedType) getClass()
                            .getGenericSuperclass()).getActualTypeArguments()[0];
this.entityClass=(类)((ParameterizedType)getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
或创建构造函数,在构造函数上传递泛型类类型:

protected AbstractEntity(Class<T> entityClass) {
    this.entityClass = entityClass;
}
受保护的抽象实体(类entityClass){
this.entityClass=entityClass;
}
然后,您的具体实体类可以在默认情况下传递其类类型,如下所示:

public class MyClass extends AbstractEntity<Long> {

    public MyClass() {
        super(Long.class);
    }
}
公共类MyClass扩展了AbstractEntity{
公共MyClass(){
超级(长类);
}
}
使用:

Type t=TypeResolver.resolveRawArgument(AbstractEntity.class,MyClass.class);
断言t==Long.class

Cheers

您无法在运行时获取
t
的类型,因为OK,我遇到的问题是我需要将字段的值设置为通过JSON输入的适当类型。它可以是Java基本类型、字符串、类型包装器或BigXXX类。所以我有一些可能的类型。关于如何检测我将要设置到变量上的类型是否可行,有什么想法吗?请尝试使用Buhake Sindi建议和类参数。但前提是我知道一些关于类层次结构及其设置的信息。我只知道这个字段是用@Id注释的。
Type<?> t = TypeResolver.resolveRawArgument(AbstractEntity.class, MyClass.class);
assert t == Long.class