【发布时间】: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