当前位置: 首页 > 知识库问答 >
问题:

如何在另一个类中获取一个类的字段名?

夹谷成龙
2023-03-14
public class Book {
  private String title;

  private Author author;
}

public class Author {
  private String name;

  private Integer age:
}

这里Book是根类,即最终的CSV将命名为books.CSV。

使用book.class.getDeclaredFields(),我们只获得字段名title和author,但是我们还需要来自author类的字段名(name和age),有没有方法获得这些字段名?

共有1个答案

阚允晨
2023-03-14

备注:

  • 远不是最佳值。
  • 不考虑循环引用问题。

给定您的模型,它将返回一个包含以下元素的列表:

    null
ClassMetadataService cms = new ClassMetadataService();
List<String> properties = cms.getProperties(Book.class);
package io.metadata;

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class ClassMetadataService {

    public List<String> getProperties(Class clazz) {
        List<String> properties = new ArrayList<>();
        this.collectProperties(new ArrayList<>(), clazz, properties);

        return properties;
    }

    private void collectProperties(List<String> pathNodes, Class clazz, List<String> properties) {
        for (Field field : clazz.getDeclaredFields()) {
            List<String> localPathNodes = new ArrayList<>(pathNodes);
            localPathNodes.add(field.getName());

            if (clazz.isPrimitive() || isJavaClass(field.getType())) {
                properties.add(localPathNodes.stream().collect(Collectors.joining(".")));
            } else {
                collectProperties(localPathNodes, field.getType(), properties);
            }
        }
    }

    private Boolean isJavaClass(Class clazz) {
        List<Class> javaClass = Arrays.asList(
                // ....
                Boolean.class,
                Byte.class,
                Short.class,
                Integer.class,
                Long.class,
                Float.class,
                Double.class,
                BigDecimal.class,
                BigInteger.class,
                Character.class,
                String.class,
                LocalDate.class,
                LocalDateTime.class
                // ....
        );

        return javaClass.stream().anyMatch(jc -> jc.equals(clazz));
    }
}


 类似资料:
  • 我有这个问题。但我很难解释,因为我不知道确切的术语。希望有人能理解。我会尽力描述。我觉得这与

  • 问题内容: 我有文本框,在另一个面板中有保存按钮。如果单击保存按钮,则必须获取第一个面板文本框的值。 如何访问? 问题答案: 只需将TextField设置为Public Static dats即可。然后您可以使用ClassName.TextFiledName访问TextField

  • 问题内容: 我有两节课 在ABC班 我想在另一个课程中使用它,让我们说DEF课程 但是它说java.lang.NullPointerException,你知道吗?谢谢 这是我的ABC类的代码,我想在另一类> _ <中使用它们 问题答案: 您需要在内存中分配ABC,否则它指向,因此NullPointerException: 编辑 :好的,如果ABC没有像这样的零参数构造函数: 您有两种选择来解决您的

  • 问题内容: 我的目标是为此激发一个应用程序的时序图,我需要在运行时提供有关调用方和被调用方类名称的信息。我可以成功检索调用者函数,但无法获得调用者类名称吗? 当我打印堆栈时,没有有关调用程序类的信息。那么有可能在运行时检索调用方类吗? 问题答案: 好吧,在按提示进行了一些挖掘之后,这是我得到的: 调用时: 给定文件: 不知道从其他对象调用该对象时的行为。

  • 我需要创建三个类:客户、产品和订单。我希望我的orders类接受来自客户和产品的实例(即,能够让一个订单包含关于客户和他们正在订购的产品的信息)。在JavaScript中设置这一点的最佳方法是什么?我最初想让我的customer和products类扩展order类,但我是否能够让order同时扩展customer和products类?