Я пытаюсь использовать отражения для создания функции, которая проверяет все пользовательские переменные класса, чтобы увидеть, есть ли у них допустимые значения на основе шаблона "[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 и другие.
Мое решение - проверить, начинается ли имя переменной, если компьютер игнорирует его, но я хотел знать, есть ли правильный / лучший способ получить только те переменные, которые я объявил в своем определении класса.
Вы, наверное, тестировали его программу без части @Entity. Я предполагаю, что spring jpa добавляет эти поля - pcInheritedFieldCount, pcFieldNames и т. д.
На самом деле это хорошее предположение, я не думал о том, что проблема не в отражениях, а в аннотации jpa.
Я тестировал его в зависимости от Java EE 7, поэтому аннотации у меня есть. Изменяет ли Spring JPA файл класса для класса UserClass? Я думал, что они расширяют класс во время выполнения.
Я считаю, что они расширяют его во время выполнения. Но, вероятно, его код заработает после того, как spring выполнил свою работу и добавил эти поля. Если вы просто посмотрите файл .class, там нет таких полей - только информация аннотации. Но эти pcInheritedFieldCount являются частью интерфейса PersistingCapable, и я считаю, что Spring добавила их в среду выполнения класса. Если не запускать в контексте Spring, он будет работать правильно
Думаю, ваш ответ - это решение моей проблемы, почему это происходит. Может быть, из-за того, что я работаю над Java EE 6 без Spring, все сделано немного по-другому.




Если вы запустите это приложение таким образом - в основном методе, а не в каком-то весеннем контексте, оно будет работать так, как вы ожидаете. Проблема в том, что эти аннотации JPA при запуске в веб-приложении обрабатываются раньше вашего кода. И что делают эти «маркеры», так это маркируют ваши классы, чтобы реализация JPA могла добавить к ним поведение. Это дополнительное поведение добавляется во время выполнения, а затем, когда вы получаете информацию о классе с отражением, она уже есть.
В качестве обходного пути я бы посоветовал вам искать методы получения вместо итерации по полям. Если это сущности базы данных, и вы хотите их отфильтровать, я думаю, это будут стандартные Java-бины и будут иметь геттер для каждого значимого свойства.
"еще какие-то переменные принимает" ??? При запуске вашей программы я получаю ровно 5 строк вывода, соответствующих 5 полям, которые вы объявили в своем классе. Пожалуйста, сделайте минимальный воспроизводимый пример.