java.lang.NoSuchFieldException в отражении?

Долгое время скрывался, здесь первый постер. Я пытался найти, но не смог найти решение моей проблемы.

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

Я могу получить массив всех полей в нужном мне классе, но я не могу получить значение любого поля. Мне нужно получить значение "currentThrottle", чтобы я мог делать некоторые вещи, когда сущность движется (и только когда она движется)

Вот мой текущий код. Я не могу понять, почему это не работает, потому что, как вы можете видеть, я использую оператор if, чтобы убедиться, что поле ДЕЙСТВИТЕЛЬНО существует, а затем он все еще говорит мне, что не может его найти.

Финальная нота; Я полностью самоучка в Java, все, что я знаю, - это читать подобные форумы и просто нырять и играть с ними; это лучший способ, которым я учусь. Итак, если есть какая-то действительно плохая практика, пожалуйста, дайте мне знать:)

Class planeClass = Class.forName("mcheli.plane.MCP_EntityPlane");
Field[] fields = planeClass.getFields();

//Some other irrelevant code

            for (Field field2 : fields) {
                String name = field2.getName();
                if (name.contains("currentThrottle")) { 
                    System.out.println("name: " + name);
                    try {
                        field = baseClass.getClass().getField(name);
                        field.setAccessible(true);

                        Class<?> targetType = field.getType();
                        Object objValue = targetType.newInstance();

                        Object value = field.get(objValue);

                        System.out.println("Throttle: " + value);
                    } catch (NoSuchFieldException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (SecurityException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (InstantiationException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }

2 ответа

Переменная objValue должна быть заменена на экземпляр объекта, из которого вы хотите получить поле:

Object value = field.get(objValue);

Должно быть:

Object value = field.get(baseClass)

Ваш код не показывает, что такое baseClass. Работаете ли вы с тем классом, который, по вашему мнению, вы используете?

Почему бы просто не использовать (try/catch не показан):

Class planeClass = Class.forName("mcheli.plane.MCP_EntityPlane");
Object plane = planeClass.newInstance();
Field throttleField = planeClass.getField("currentThrottle");
Object thottleValue = throttleField.get(plane);
Другие вопросы по тегам