当前位置: 首页 > 面试题库 >

Java通用参数类的反射?

易英奕
2023-03-14
问题内容

想象以下情况:

class MyClass extends OtherClass<String>{

   String myName;
   //Whatever

}

class OtherClass<T> {

   T myfield;

}

我正在专门使用反射来分析MyClass
(MyClass.class).getDeclaredFields(),在这种情况下,我将获得以下字段(和Types,使用Field的getType()):

myName --> String
myField --> T

我想获取T的实际Type,由于扩展符号中的显式“ String”,因此在运行时就知道了它,我该如何获取myField的非遗传类型?

解决的编辑:

答案似乎是“你做不到”。对于以后可能看这个问题的人,我建议使用Jackson(我试图这样做来生成JSON)并以这样一种方式注释您的类和字段,以便Jackson知道继承层次结构并可以自动执行操作建议以下正确答案。


问题答案:

仅在您显式使用的情况下String,才可以通过反射来实现,否则此信息将由于类型擦除而丢失。

ParameterizedType t = (ParameterizedType) MyClass.class.getGenericSuperclass(); // OtherClass<String>
Class<?> clazz = (Class<?>) t.getActualTypeArguments()[0]; // Class<String>


 类似资料:
  • 问题内容: 是否可以获取通用参数的类型? 一个例子: 问题答案: 我曾经偶然发现的一种结构看起来像 因此,似乎有些不可思议的想法使我感到遗憾,我很不了解…对不起。

  • 问题内容: 如何使用反射在Java中创建通用的参数化类? 我有 我需要一个实例。 我尝试了 但找不到可以让我获取适当​​类型的实例的语法,例如说 那么,我该怎么做呢? 问题答案: Java使用基于擦除的仿制药(即,类型参数是在运行时,例如擦除,并且被视为在运行时是同一类型)。由于反射本质上是运行时功能,因此根本不使用或不涉及类型参数。 换句话说,当您使用反射时,您只能实例化原始类型(,不能实例化)

  • 问题内容: 我有一个抽象类: 我需要充实的孩子-每个孩子都有自己的孩子 我只找到一种解决方案,但需要编译器参数 这是最好的解决方案吗?没有我们可以做同样的事情吗? 问题答案: 实现此目的的类型安全但很简单的方法是传递令牌“编译器可以看到它的位置”: 如果您执行的是未经检查的强制转换,但您“知道自己在做什么”,并且希望编译器停止抱怨,则正确的方法是将非类型安全但您知道它们的工作位本地化。使用: (我

  • 问题内容: 使用泛型时,我在Java中有一个小问题。我有一堂课: 在方法中,我需要获取类型名称。有没有办法找到字符串使用? (如果创建了,我希望能够做到这一点- 我必须使用通用性,因为我的方法之一必须返回)。 这似乎很容易,但是我不知道如何去做。 问题答案: 由于 类型擦除, 您通常无法执行此操作-的实例不 知道 的类型。如果需要,一种方法是使用类型文字: 然后: 这很丑陋,但这就是类型擦除的作用

  • 问题内容: 我在类中有以下两种方法: 下面的代码行 印刷品,如何使其印刷? 问题答案: 要使用反射调用以原始类型作为参数的方法: 你可以用 要么 同样适用于其他原始类型

  • 问题内容: 好吧,我们有: 我可以像这样使用它: 我们如何在代码中解析该lambda参数的实际值? 当我们将其用作内联实现时,从该类的方法中提取并没有那么困难。 我想念什么吗?或者只是Java不支持lambda类? 为了更清洁: 该lambda被包裹(在提到的中),它在提取实际参数以进行进一步的反射方法调用。在此之前,它使用Spring的将提供的参数转换为目标参数。 在这种情况下,方法是在实际应用