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);