[英]Run a java method by passing class name and method name as parameter
我正在嘗試創建一個程序,當類名稱和方法名稱作為String參數傳遞給調用者時,執行特定的方法。 請考慮以下代碼。 我有一個類CarBean:
public class CarBean {
private String brand;
private String color;
/**
* @return the brand
*/
public String getBrand() {
return brand;
}
/**
* @param the brand to set
*/
public void setBrand(String brand) {
this.brand= brand;
}
/**
* @return the color
*/
public String getColor() {
return color;
}
/**
* @param the color to set
*/
public void setColor(String color) {
this.color= color;
}
}
現在我想通過以下方法運行:
runTheMehod("CarBean","getColor");
runTheMethod的實現如下:
public runTheMethod(String className, String methodName){
try {
Object carObj = Class.forName(className).newInstance();
//What to do now???
} catch (InstantiationException | IllegalAccessException
| ClassNotFoundException e) {
e.printStackTrace();
}
}
我可以使用類名獲取一個對象。 現在我需要將它轉換為CarBean對象然后我可以運行它的方法。 所以想知道如何在運行時強制轉換它,因為每個調用的類名都不同。 另外,在嘗試調用之前,我可以檢查類是否具有特定方法嗎?
任何關於這個問題的建議都將受到贊賞。 此外,我很想知道是否有更好的方法來做到這一點。
現在做什么???
您現在可以像這樣調用carObj
上的方法:
Method method = carObj.getClass().getMethod(methodName);
method.invoke(carObj);
也可以看看:
如果您要做的就是按名稱調用方法,則無需將其強制轉換為任何方法。 使用Object
進一步反射就足夠了。
請參閱Class.getDeclaredMethod()
,如下所示:
Object carObj = ...;
Method method = carObj.getClass().getDeclaredMethod(methodName, ...);
Object retObj = method.invoke(carObj, ...);
請注意,我們並不關心carObj
實際上是什么類型,但如果您想檢查,您可以始終使用instanceof
或Class.isAssignableFrom
或Class.isInstance
。
但是,有點奇怪的是,您實例化一個新對象,然后一次性調用其中一個方法。 一旦你的runTheMethod
返回,該對象就會消失。
順便說一句,看起來你只是想獲取並設置bean屬性。 您可能想要查看Apache Commons BeanUtils ,然后您的示例變得簡單:
CarBean bean = ...;
String color = (String)PropertyUtils.getSimpleProperty(bean, "color"); // calls getter.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.