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

如何确定Java中通用字段的类型?

孙才捷
2023-03-14
问题内容

我一直在尝试确定类中字段的类型。我已经看过所有自省html" target="_blank">方法,但还没有弄清楚该怎么做。这将用于从Java类生成xml /
json。我在这里查看了许多问题,但没有找到我真正需要的东西。

例:

class Person {
    public final String name;
    public final List<Person> children;
}

在封送该对象时,我需要知道该chidren字段是类型的对象的列表Person,因此我可以正确地封送它。

我试过了

for (Field field : Person.class.getDeclaredFields()) {
    System.out.format("Type: %s%n", field.getType());
}

但是,这只会告诉我,这是一个List,不是ListPerson小号

谢谢


问题答案:

看一看从Java Tutorial
Trail中获取字段类型:Reflection
API

基本上,您需要做的是获取所有java.lang.reflect.Field班级
并调用 Field#getType()每个 班级(请检查下面的编辑)。要获取
所有
对象字段,包括公共,受保护,打包和私有访问字段,只需使用Class.getDeclaredFields()。像这样:

for (Field field : Person.class.getDeclaredFields()) {
    System.out.format("Type: %s%n", field.getType());
    System.out.format("GenericType: %s%n", field.getGenericType());
}

编辑:
正如哇哇在评论中指出的那样,您实际上需要调用Field#getGenericType(),检查返回的Type是否为a
ParameterizedType,然后相应地获取参数。使用ParameterizedType#getRawType()ParameterizedType#getActualTypeArgument()分别获取a的原始类型和类型参数的数组ParameterizedType。以下代码演示了这一点:

for (Field field : Person.class.getDeclaredFields()) {
    System.out.print("Field: " + field.getName() + " - ");
    Type type = field.getGenericType();
    if (type instanceof ParameterizedType) {
        ParameterizedType pType = (ParameterizedType)type;
        System.out.print("Raw type: " + pType.getRawType() + " - ");
        System.out.println("Type args: " + pType.getActualTypeArguments()[0]);
    } else {
        System.out.println("Type: " + field.getType());
    }
}

并输出:

Field: name - Type: class java.lang.String
Field: children - Raw type: interface java.util.List - Type args: class foo.Person


 类似资料:
  • 问题内容: 我在MySQL表中有两个表字段。一个是VARCHAR,是分类广告(分类网站)的“标题”。另一个是TEXT字段,其中包含用于分类的“文本”。 两个问题: 如何确定如何索引这两个字段? (什么字段类型,要使用什么类,等等) 目前,我有一个“ ad_id”作为每个广告的唯一标识符,例如“ bmw_m3_82398292”。 每当SOLR找到“查询匹配”时,如何使SOLR返回此标识符? (标识

  • 问题内容: 如果我要创建一个泛型的Java类,例如: 如何才能内部确定该类,最后变成什么“ T”? 我戳了一下Java API并使用了反射的东西,instanceof,getClass,.class等,但是我似乎无法做出决定。我觉得我已经接近了,只需要合并多个电话,但会持续很短的时间。 更具体地说,我试图确定是否用3种可能的类型之一实例化了该类。 问题答案: 我在他的一些项目中使用了与他在此处解释

  • 我正在通过反射动态实例化一个对象,方法是将字段名称与地图中类似的命名键进行匹配。其中一个字段是字符数组(char[]): 在plinko迭代器中,我为目标类上的类型编写了代码,例如。 例如,其中将是 如果field dClass类型是char[],要测试的表达式是什么?

  • 问题内容: 我正在创建一个通用类,并且需要使用一种方法来了解当前使用的通用类型的Class。原因是我调用的方法之一期望将此作为参数。 例: 显然,上面的示例不起作用,并导致以下错误:类型参数T的非法类文字。 我的问题是:有人知道这方面有很好的选择或解决方法吗? 问题答案: 仍然存在相同的问题:常规信息在运行时被删除,无法恢复。一种解决方法是在静态方法的参数中传递T类: 很难看,但是可以用。

  • 问题内容: 如果class 和class 扩展了class 并且我有一个对象类型或,我如何确定它是实例的哪种类型? 问题答案:

  • 如何通过带有自定义字段的wp rest api v2正确创建自定义post类型记录?无法创建自定义字段或更新它们。 我在一个自托管的wordpress安装中安装了超级列表和超级列表子主题。 此主题使用自定义分类法来定义类别、位置、称为业务的自定义帖子类型以及自定义帖子类型的帖子元中的自定义字段 我正在尝试使用rest api v2将数据导入站点,并成功创建了自定义类别和位置。我使用REST API