我有一个类:
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;
}
}
该类有一个类电机的私人领域:
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();
请记住,如果该方法不为 null,则调用方法可以返回 Object。
此外,如果您拥有 Car 和 VehicleClass 类,那么更好的方法是创建一个新接口,声明特定于 Car 或 VehicleClass 的所有函数,并将 getMotor 添加到其中。然后,您可以使用 instanceof 验证对象是否属于此接口并强制转换它。这是更干净的代码,并确保代码在类被修改时继续工作。
一般来说,使用反射是最后的手段。
只是在做:
Motor m = (Motor) cClass.getDeclaredMethod("getMotor").invoke(c);
应该给你电机对象。