gpt4 book ai didi

Java 泛型 : Accessing Generic Type at runtime

转载 作者:搜寻专家 更新时间:2023-10-30 19:55:52 25 4
gpt4 key购买 nike

我希望在运行时访问已声明字段的通用类型。我以前的印象是,由于 Java 类型删除,这是不可能的。然而,情况并非如此,因为一些众所周知的框架在运行时通过反射利用泛型类型。

例如,Guice 将根据您提供的通用类型实现一个 Provider:

public class Injectable{

@Inject
private Provider<SomeType> someTypeProvider;

}

如何通过反射 API 访问字段或任何此类类型/方法/等的“So​​meType”通用属性?

此外,了解如何通过 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;
System.out.println("fieldArgClass = " + fieldArgClass);
}
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
}

结果:

fieldArgClass = class test.TypeReflectionExample$SomeType

对于方法、构造函数、父类(super class)扩展/实现等也可以这样做

我要奖励 haylem,因为他的帖子让我找到了这个解决方案,即使它没有直接回答我的问题。

最佳答案

的确,泛型在 Java 运行时通常不为人所知,因为它们是通过类型删除实现的。

反射(reflect)泛型?

但是,您仍然可以提取一些关于已声明类型(不是运行时对象的类型)的有值(value)信息,如 Ian Roberston 的文章 Reflecting Generics 中所述。 和 Prenkov 的文章 Java Reflection: Generics .

泛型和类型删除的背景

引入泛型的同时在源 qnd 二进制级别保持向后兼容性,因此它们有一些限制,例如:

  • 如果没有至少一些泛型支持指标(这里是所谓的钻石运算符 <>),就不可能有简写形式,
  • 无法在运行时检查泛型类型,因为它们必须用 Type Erasure 实现.

进一步阅读

关于Java 泛型 : Accessing Generic Type at runtime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9548779/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com