簡體   English   中英

通過將類名和方法名作為參數傳遞來運行java方法

[英]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);

也可以看看:

Method.invoke

如果您要做的就是按名稱調用方法,則無需將其強制轉換為任何方法。 使用Object進一步反射就足夠了。

請參閱Class.getDeclaredMethod() ,如下所示:

Object carObj = ...;
Method method = carObj.getClass().getDeclaredMethod(methodName, ...);
Object retObj = method.invoke(carObj, ...);

請注意,我們並不關心carObj實際上是什么類型,但如果您想檢查,您可以始終使用instanceofClass.isAssignableFromClass.isInstance

但是,有點奇怪的是,您實例化一個新對象,然后一次性調用其中一個方法。 一旦你的runTheMethod返回,該對象就會消失。


順便說一句,看起來你只是想獲取並設置bean屬性。 您可能想要查看Apache Commons BeanUtils ,然后您的示例變得簡單:

CarBean bean = ...;
String color = (String)PropertyUtils.getSimpleProperty(bean, "color"); // calls getter.

我懷疑你真的需要這樣做。 我懷疑你有一個XY問題 您的問題有點類似於詢問Java是否具有eval函數且正確答案是否相似

首先問問自己,這些String來自哪里? 您的程序的另一部分是否生成了它們,或者是用戶提供的輸入?

  • 我的程序的另一部分生成它 :因此,您希望程序的一部分決定要執行的操作類型,但不執行操作,以及執行所選操作的第二部分。 而不是生成然后評估String ,而是根據您的具體情況使用策略命令構建器設計模式。

  • 它是用戶輸入 :用戶可以輸入任何內容 ,包括類和方法名稱,這些名稱在執行時可能導致程序行為異常,崩潰,泄露應該保密的信息,破壞持久性信息(如數據庫內容),和其他這樣的骯臟。 防止這種情況的唯一方法是解析String ,然后立即在成功的解析上執行該方法,或讓解析器創建一個Command對象供以后執行。

暫無
暫無

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

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