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-бинами и будут иметь геттер для каждого значимого свойства.

Другие вопросы по тегам