Получить значение из переменной класса через отражение, а затем использовать методы значения - PullRequest
2 голосов
/ 24 марта 2019

Я пытаюсь получить значение из переменной класса путем отражения. Например, у меня есть класс Car, и у него есть свойство engine. Кроме того, в классе Engine я переопределил метод toString() и определил еще один метод hello().

А потом, когда я пытаюсь получить значение через

getDeclaredField() метод, похоже, что я получаю правильное значение Engine экземпляр, но по некоторым причинам я не могу вызвать метод hello() для него.

Автомобиль класс

public class Car {
    final Engine engine = new Engine();
}

Двигатель Класс

public class Engine {

    public void hello() {
        System.out.println("hello");
    }

    @Override
    public String toString() {
        return "Engine";
    }
}

Основной Класс

public class Main {
    public static void main(String[] args) {
        try {
            Field field = Car.class.getDeclaredField("engine");
            Object value = field.get(new Car());

            // It's print Engine as expected
            System.out.println(value);

            // But I can't call hello() method
            // value.hello()

        } catch (NoSuchFieldException | IllegalAccessException e) {
            System.out.println("Exception");
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 24 марта 2019

Чтобы вызвать метод hello(), сначала убедитесь, что ваш value является экземпляром Engine (с использованием instanceof), а затем приведите value к Engine. Как,

// Check type, cast instance and call hello() method
if (value instanceof Engine) {
    ((Engine) value).hello();
}

который вы также можете написать как

if (value instanceof Engine) {
    Engine.class.cast(value).hello();
}

также принято сохранять ссылку Class и использовать ее вместо жесткого кодирования конкретного Class, с которым вы работаете; например,

Class<? extends Engine> cls = Engine.class
// ...
if (cls.isAssignableFrom(value.getClass())) {
    cls.cast(value).hello();
}
0 голосов
/ 24 марта 2019

Вам также необходимо позвонить

field.setAccessible(true);

, прежде чем пытаться получить к нему доступ.
Хотя это может быть только для частных полей, см. @ Elliott.Frisch reply

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...