Как извлечь объект из метода, который вызывается с помощью Java Reflection API? - PullRequest
0 голосов
/ 09 октября 2018

У меня есть класс:

package builderpattern;

import builderpattern.parts.Brakes;
import builderpattern.parts.Gearbox;
import builderpattern.parts.Motor;
import builderpattern.parts.Windshield;

public class Car extends VehicleClass implements IVehicle{

    @Override
    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    private Motor motor;
    private Gearbox gearbox;
    private Windshield windshield;
    private Brakes brakes;

    public Brakes getBrakes() {
        return brakes;
    }

    public void setBrakes(Brakes brakes) {
        this.brakes = brakes;
    }

    public Motor getMotor() {
        return motor;
    }

    public void setMotor(Motor motor) {
        this.motor = motor;
    }

    public Gearbox getGearbox() {
        return gearbox;
    }

    public void setGearbox(Gearbox gearbox) {
        this.gearbox = gearbox;
    }

    public Windshield getWindshield() {
        return windshield;
    }

    public void setWindshield(Windshield windshield) {
        this.windshield = windshield;
    }

}

Этот класс имеет приватное поле класса Motor:

package builderpattern.parts;

public class Motor {

    private double horsepower;
    private String name;
    private int numberOfCylinders;

    public double getHorsepower() {
        return horsepower;
    }

    public void setHorsepower(double horsepower) {
        this.horsepower = horsepower;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getNumberOfCylinders() {
        return numberOfCylinders;
    }

    public void setNumberOfCylinders(int numberOfCylinders) {
        this.numberOfCylinders = numberOfCylinders;
    }

    public Motor(double horsepower, String name, int numberOfCylinders) {
        super();
        this.horsepower = horsepower;
        this.name = name;
        this.numberOfCylinders = numberOfCylinders;
    }   
}

Итак, я пытаюсь вызвать getMotor () из класса Car, используя метод invoke из Java Reflection API, но я хочу получить объект Motor, чтобы я мог вызвать объект getName () из класса Motor.Можно ли это сделать?Возможно, не путем извлечения объекта Motor, но каким-то образом получить доступ к методу getName ().Может кто-то помочь мне с этим?Заранее спасибо.Вот что я сделал до сих пор:

Car c = new Car();
Class cClass = c.getClass();
cClass.getDeclaredMethod("getMotor").invoke(c, null);

Это только возвращает объект метода с метаданными о методе.

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Просто сделав:

Motor m = (Motor) cClass.getDeclaredMethod("getMotor").invoke(c);

должен дать вам моторный объект.

0 голосов
/ 09 октября 2018

Вы почти ответили на свой вопрос.Чтобы получить имя класса Moter, все, что вам нужно сделать, это примерно так:

Car c = new Car();
Class cClass = c.getClass();
Object uncastedMotor = cClass.getDeclaredMethod("getMotor").invoke(c, null);
String motorName = ((Motor)uncastedMotor).getName();

Имейте в виду, что метод invoke может возвращать Object, если метод не является void.

Также, если у вас есть классы Car и VehicleClass, лучшим способом было бы создать новый интерфейс, объявляющий все функции, специфичные для Car или VehicleClass, и добавить к нему getMotor.Затем вы можете проверить, принадлежит ли объект этому интерфейсу, с помощью instanceof и привести его.Это намного более чистый код и гарантирует, что код продолжит работать, если классы будут изменены.

Использование рефлексии, вообще говоря, является последним средством.

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