簡體   English   中英

如何從使用Java Reflection API調用的方法中檢索對象?

[英]How to retrieve an object from a method that is invoked using Java Reflection API?

我有一堂課:

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對象,以便可以從Motor類中調用getName()對象。 。 能做到嗎? 也許不是通過獲取Motor對象,而是以某種方式訪問​​getName()方法。 有人可以幫我弄這個嗎? 提前致謝。 到目前為止,這是我所做的:

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

這只會返回帶有有關該方法的元數據的Method對象。

您幾乎回答了自己的問題。 要獲得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驗證對象是否屬於此接口,並將其強制轉換。 這是更簡潔的代碼,並確保在修改類后代碼可以繼續工作。

一般來說,使用反射是最后的選擇。

只是做:

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

應該給你運動對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM