java反射只获取所有用户创建的类变量

时间:2018-06-14 11:00:13

标签: java class generics reflection javabeans

我正在尝试使用反射创建一个函数来检查所有自定义类变量,以查看它们是否具有基于模式的有效值" [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忽略它但我想知道是否有正确/最好的方法来获得我在我的类定义中声明的这些变量。

1 个答案:

答案 0 :(得分:0)

如果您运行此应用程序 - 在主方法中而不是在某些弹簧上下文中,它将按预期工作。问题是,在您的代码之前处理在Web应用程序中运行时的这些JPA语言。这些“标记”的作用是标记您的类,以便JPA实现可以为它们添加行为。在运行时添加了这个附加行为,然后当您使用反射的类信息时,它已经存在。

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