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。
我正在尝试使用反射来创建一个函数来检查所有自定义的 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。