【问题标题】:java reflections to get all user created class variables onlyjava反射仅获取所有用户创建的类变量
【发布时间】:2018-06-14 11:00:13
【问题描述】:

我正在尝试使用反射创建一个函数来检查所有自定义类变量,以查看它们是否具有基于模式“[0-9a-zA-Z_]+”的有效值

我找到了一些代码模板并适应了我的代码,看起来像这样

UserClass uc = new UserClass();
Class clazz = uc.getClass();
            for (Field field : clazz.getDeclaredFields()) {
                field.setAccessible(true);
                String name = field.getName();
                Object value;
                try {
                    value = field.get( uc );
                     System.out.printf("Field name: %s, Field value: %s%n", name, value);
                } catch (IllegalArgumentException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }


            }

我的 UserClass 看起来像

@Entity
public class UserClass implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;

    private String descr;

    private String name;

    @OneToMany(mappedBy="userClassId",fetch=FetchType.LAZY)
    private List<packages> packagesList;

我正常获取 UserClass 变量名称和值,但问题是它还需要一些我不关心的其他变量,例如 pcInheritedFieldCount、pcFieldNames 等

我的解决方案是检查变量名是否开始,如果 pc 忽略它,但我想知道是否有正确/最好的方法来仅获取我在类定义中声明的这些变量。

【问题讨论】:

  • "它还需要一些其他变量" ???运行您的程序时,我得到正好 5 行输出,对应于您在类中声明的 5 个字段。请发minimal reproducible example
  • 您可能在没有@Entity 部分的情况下测试了他的程序。我猜 spring jpa 添加了这些字段 - pcInheritedFieldCount、pcFieldNames 等
  • 这实际上是一个很好的猜测,我没有想到不是反射而是 jpa 注释导致了麻烦
  • 我测试了它对 Java EE 7 的依赖,所以我手头有注释。 Spring JPA 是否更改类UserClass 的类文件?我以为他们在运行时扩展类。
  • 我相信他们会在运行时对其进行扩展。但可能他的代码在 spring 完成它的工作并添加了这些字段之后才起作用。如果您只查看 .class 文件,则没有这样的字段 - 只有注释信息。但是这些 pcInheritedFieldCount 是 PersistingCapable 接口的一部分,我相信 spring 已将它们添加到类运行时中。如果不在 spring 上下文中运行,它将正常工作

标签: java class generics reflection javabeans


【解决方案1】:

如果你像这样运行这个应用程序——在 main 方法中而不是在某些 spring 上下文中,它会按你期望的那样工作。问题是这些 JPA 注释在 Web 应用程序中运行时会在您的代码之前处理。这些“标记”所做的是标记您的类,以便 JPA 实现可以向它们添加行为。该附加行为是在运行时添加的,然后当您使用反射的类信息时,它已经存在了。

对于解决方法,我建议您寻找 getter 方法,而不是遍历字段。如果这些是数据库实体并且您想过滤它们,我猜它们将是标准的 java bean,并且每个有意义的属性都有 getter。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 2013-02-25
    • 2010-10-19
    相关资源
    最近更新 更多