java 仅获取所有用户创建的 class 变量的反射

java reflections to get all user created class variables only

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

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

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();
                }


            }

我的用户类看起来像

@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 忽略它,但我想知道是否有 right/the 最好的方法来只获取我在 class 中声明的这些变量定义。

如果您 运行 这个应用程序是这样的 - 在 main 方法中而不是在某些 spring 上下文中,它将按您预期的那样工作。问题是这些 JPA 注释 when 运行 在 Web 应用程序中是在您的代码之前处理的。这些 "markers" 所做的是标记您的 classes,以便 JPA 实现可以向它们添加行为。该附加行为是在 运行 时添加的,然后当您 class 带有反射的信息时它已经存在了。

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