我正在尝试使用反射创建一个函数来检查所有自定义类变量,以查看它们是否具有基于模式的有效值" [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忽略它但我想知道是否有正确/最好的方法来获得我在我的类定义中声明的这些变量。
答案 0 :(得分:0)
如果您运行此应用程序 - 在主方法中而不是在某些弹簧上下文中,它将按预期工作。问题是,在您的代码之前处理在Web应用程序中运行时的这些JPA语言。这些“标记”的作用是标记您的类,以便JPA实现可以为它们添加行为。在运行时添加了这个附加行为,然后当您使用反射的类信息时,它已经存在。
对于解决方法,我建议您查找getter方法,而不是遍历字段。如果这些是数据库实体并且您想要过滤它们,我猜它们将是标准的Java bean,并且每个有意义的属性都会有getter。