Отражения 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();
                }


            }

Мой 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 и другие.

Мое решение - проверить, начинается ли имя переменной, если компьютер игнорирует его, но я хотел знать, есть ли правильный / лучший способ получить только те переменные, которые я объявил в своем определении класса.

"еще какие-то переменные принимает" ??? При запуске вашей программы я получаю ровно 5 строк вывода, соответствующих 5 полям, которые вы объявили в своем классе. Пожалуйста, сделайте минимальный воспроизводимый пример.

Seelenvirtuose 14.06.2018 13:04

Вы, наверное, тестировали его программу без части @Entity. Я предполагаю, что spring jpa добавляет эти поля - pcInheritedFieldCount, pcFieldNames и т. д.

Veselin Davidov 14.06.2018 13:05

На самом деле это хорошее предположение, я не думал о том, что проблема не в отражениях, а в аннотации jpa.

UnitTest404 14.06.2018 13:10

Я тестировал его в зависимости от Java EE 7, поэтому аннотации у меня есть. Изменяет ли Spring JPA файл класса для класса UserClass? Я думал, что они расширяют класс во время выполнения.

Seelenvirtuose 14.06.2018 13:18

Я считаю, что они расширяют его во время выполнения. Но, вероятно, его код заработает после того, как spring выполнил свою работу и добавил эти поля. Если вы просто посмотрите файл .class, там нет таких полей - только информация аннотации. Но эти pcInheritedFieldCount являются частью интерфейса PersistingCapable, и я считаю, что Spring добавила их в среду выполнения класса. Если не запускать в контексте Spring, он будет работать правильно

Veselin Davidov 14.06.2018 13:22

Думаю, ваш ответ - это решение моей проблемы, почему это происходит. Может быть, из-за того, что я работаю над Java EE 6 без Spring, все сделано немного по-другому.

UnitTest404 14.06.2018 13:29
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

В качестве обходного пути я бы посоветовал вам искать методы получения вместо итерации по полям. Если это сущности базы данных, и вы хотите их отфильтровать, я думаю, это будут стандартные Java-бины и будут иметь геттер для каждого значимого свойства.

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