1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

[Помогите] При получении значения из Field при помощи рефлексии всегда null

Тема в разделе "Оффтопик", создана пользователем 0xLairon1, 21 апр 2023.

  1. Автор темы
    0xLairon1

    0xLairon1 Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    0xLairon1
    У меня есть класс Config в котором я пытаюсь получить данные из поля класса который является наследником класса Config и при любом раскладе я получаю null.

    Я перерыл уже половину статей по рефлексии но никто не упоминает про получение полей из классов наследников и что это может не работать.

    Чтобы стало яснее:
    Есть класс Config, в котором есть некие методы.
    Есть класс SettingsConfig в котором лежат приватные поля и SettingsConfig extends Config.
    Класс Config не должен знать какие у него есть наследники, но знает что от него 100% ктото наследуется.

    Я пытаюсь получить в коде класса Config значения из полей в классе SettingsConfig и всегда вижу null за исключением если это примитив.

    Что интересно при попытке достать массив полей то рефлексия достает все поля которые есть.

    P.S. Поля в SettingsConfig точно проинициализированы и не null.

    Знаю что форум по майну и в частности Bukkit но больше не знаю куда написать)
    Знатоки рефлексии помогите пж)
     
  2. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Можешь показать, как именно у тебя устроены эти классы сейчас?
     
  3. Автор темы
    0xLairon1

    0xLairon1 Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    0xLairon1
    https://github.com/Lairon1/xConfig

    Единственный тест: (test) com.lairon.libs.xconfig.ConfigTest
    Класс с рефлексией: com.lairon.libs.xconfig.Config
    Метод в котором null: com.lairon.libs.xconfig.Config#loadConfigEntry строка 107
    SettingsConfig: (test) com.lairon.libs.xconfig.configs.SettingsConfig
     
    Последнее редактирование: 22 апр 2023
  4. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Скорее всего проблема в порядке инициализации. Когда ты вызываешь super(...), твои поля ещё не инициализированы, от чего и имеют значение null. Можешь повторить в таком сетапе:
    PHP:
    public class SomeObj {
        public 
    SomeObj() {
            
    updateStuff();
        }

        public 
    String str() {
            return 
    "super";
        }

        protected 
    void updateStuff() {
            
    System.out.println(str());
            for (
    Field field this.getClass().getDeclaredFields()) {
                
    field.setAccessible(true);
                try {
                    
    System.out.println(field.get(this));
                } catch (
    IllegalAccessException e) {
                    throw new 
    RuntimeException(e);
                }
                
    field.setAccessible(false);
            }
        }
    }
    PHP:
    public class ChildObj extends SomeObj {
        private 
    String str "child";

        public 
    ChildObj() {
            
    super();
        }

        @
    Override
        
    public String str() {
            return 
    str;
        }
    }
    При вызове updateStuff() из конструктора SomeObj тебе дважды покажет null. Сделай это в ChildObj, и сразу покажет ожидаемое значение.
    Тут либо вызывать метод loadConfigEntry в конструкторе наследников, либо доверить этот вызов юзеру API.
     

Поделиться этой страницей