如何从使用Java Reflection API调用的方法中检索对象?

时间:2018-10-09 11:15:45

标签: java reflection

我有一堂课

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

所以我想做的是使用Java Reflection API中的invoke方法从Car类中调用getMotor()方法,但是我想获取Motor对象,以便可以从中调用getName()对象。汽车课。能做到吗?也许不是通过获取Motor对象,而是以某种方式访问​​getName()方法。有人可以帮我弄这个吗?提前致谢。 到目前为止,这是我所做的:

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

这只会返回带有有关该方法的元数据的Method对象。

2 个答案:

答案 0 :(得分:0)

您几乎回答了自己的问题。要获得Moter类的名称,您需要做的就是这样:

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

请记住,如果方法不是无效的,则invoke方法可以返回Object。

此外,如果您拥有Car和VehicleClass类,那么更好的方法是创建一个新接口,声明特定于Car或VehicleClass的所有功能,并将getMotor添加到该接口。然后,您可以使用instanceof验证对象是否属于此接口,并将其强制转换。这是更简洁的代码,并确保在修改类后代码可以继续工作。

一般来说,使用反射是最后的选择。

答案 1 :(得分:0)

只要做:

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

应该给你运动对象。