[英]How to estimate execution time of method when it is invoked using Java Reflection
[英]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.