Java-отражения, чтобы получить только все созданные пользователем переменные класса
Я пытаюсь использовать отражения, чтобы создать функцию, которая проверяет все пользовательские переменные класса, чтобы увидеть, имеют ли они допустимые значения на основе шаблона "[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();
}
}
Мой пользовательский класс выглядит
@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 ответ
Если вы запустите это приложение таким образом - в основном методе, а не в каком-то весеннем контексте, оно будет работать так, как вы ожидаете. Проблема в том, что эти аннотации JPA при запуске в веб-приложении обрабатываются перед вашим кодом. И что эти "маркеры" делают, чтобы пометить ваши классы, чтобы реализация JPA могла добавить к ним поведение. Это дополнительное поведение добавляется во время выполнения, а затем, когда вы отображаете информацию о классе, она уже там.
В качестве обходного пути я бы предложил вам искать методы получения, а не перебирать поля. Если это объекты базы данных и вы хотите отфильтровать их, я думаю, они будут стандартными Java-бинами и будут иметь геттер для каждого значимого свойства.