相关疑难解决方法(0)

Java Generics:在运行时访问Generic Type

我想在运行时访问声明字段的泛型类型.我之前的印象是,由于Java类型的擦除,这是不可能的.但是,情况并非如此,因为一些众所周知的框架在运行时通过反射来利用泛型类型.

例如,Guice将根据您提供的泛型类型实现Provider:

public class Injectable{

    @Inject
    private Provider<SomeType> someTypeProvider;

}
Run Code Online (Sandbox Code Playgroud)

如何通过反射API访问字段的"SomeType"泛型属性或任何此类类型/方法/等?

此外,了解如何通过Java 6 Annotation Processor API访问这些泛型类型属性也很有帮助.

谢谢.

编辑:

谢谢大家的指示.我找到了一种方法,使用haylem的链接,特别是Prenkov的文章Java Reflection:Generics.

这是我正在寻找的答案:

/**
 * @author John Ericksen
 */
public class TypeReflectionExample {

    public class SomeType{}

    public class Injectable{
        @Inject  private Provider<SomeType> someTypeProvider;
    }

    public static void main(String[] args){

        try {
            Field providerField = Injectable.class.getDeclaredField("someTypeProvider");

            Type genericFieldType = providerField.getGenericType();

            if(genericFieldType instanceof ParameterizedType){
                ParameterizedType aType = (ParameterizedType) genericFieldType;
                Type[] fieldArgTypes = aType.getActualTypeArguments();
                for(Type fieldArgType : fieldArgTypes){
                    Class fieldArgClass = (Class) fieldArgType; …
Run Code Online (Sandbox Code Playgroud)

java generics guice type-erasure annotation-processing

14
推荐指数
1
解决办法
7913
查看次数

在Java 6注释处理器中查找方法返回类型的类型参数

我正在编写一个工具,它使用注释处理器根据注释类的方法的返回类型生成源代码.返回类型始终A是定义类型变量的接口的某个子类型(接口或类)T.

interface A<T>{T m();};
Run Code Online (Sandbox Code Playgroud)

我想找到方法m()返回值类型变量的类型参数T.

返回类型由注释处理器表示为javax.lang.model.type.TypeMirror实例.最简单的情况是A<T>直接返回.

@SomeAnnotation
class SomeClass{
    A<T> x();
}
Run Code Online (Sandbox Code Playgroud)

要找到的处理器代码T非常简单.(我会在这里投射而不是使用访问者API来保持代码简单.)

DeclaredType type = (DeclaredType) typeMirror;
TypeMirror t = type.getTypeArguments().get(0);
Run Code Online (Sandbox Code Playgroud)

TypeMirror返回类型的是javax.lang.model.type.DeclaredTypeT是第一个类型参数.其结果t是一javax.lang.model.type.TypeVariableT.同样适用于具体的返回类型A<B>(B某种类型:) interface B{}.结果tDeclaredType代表B.

其他结果类型开始变得复杂:

interface Subtype<T> extends A<T>{}
interface Concrete extends A<B>{};
interface Multiple<B,T> extends A<T>{}
interface Bounds<T extends B> extends …
Run Code Online (Sandbox Code Playgroud)

java generics annotations annotation-processing

9
推荐指数
2
解决办法
6426
查看次数