第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何使用 Java 反射調(diào)用每個(gè)方法在運(yùn)行時(shí)具有不同參數(shù)的類(lèi)的方法?

如何使用 Java 反射調(diào)用每個(gè)方法在運(yùn)行時(shí)具有不同參數(shù)的類(lèi)的方法?

汪汪一只貓 2021-11-17 15:25:25
我正在為 selenium 開(kāi)發(fā)一個(gè)關(guān)鍵字驅(qū)動(dòng)的框架。我在一個(gè)單獨(dú)的類(lèi)中編寫(xiě)了我的方法。以下是包含打開(kāi)主頁(yè)、輸入用戶(hù)名和密碼以及單擊登錄按鈕的操作方法的類(lèi)。package actions;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;public class adminlogin {    WebDriver driver;    public adminlogin(WebDriver driver){        this.driver = driver;    }    public void adminopenhomepage() {        driver.get("http://localhost/carrental/admin/");    }    public void adminenterusername(WebElement username) {        username.sendKeys("admin");    }    public void adminenterpassword(WebElement password) {        password.sendKeys("Test@12345");    }    public void adminclickloginbutton(WebElement loginbutton) {        loginbutton.click();    }    public void adminclosebrowser() {        driver.close();    }}我在列表中有關(guān)鍵字,我遍歷關(guān)鍵字并使用反射調(diào)用上述方法。我想要做的一種方法是在運(yùn)行時(shí)獲取參數(shù)類(lèi)型和參數(shù)數(shù)量,以便我可以相應(yīng)地傳遞參數(shù)。我正在嘗試使用 getDeclaredMethod(keyword) 獲取該方法,但這僅適用于那些沒(méi)有像 adminopenhomepage() 這樣的參數(shù)的方法,并且對(duì)所有其他方法都沒(méi)有例外,因?yàn)樗鼈兘邮軈?shù)。誰(shuí)能告訴我如何解決這個(gè)問(wèn)題?for(String str : originalkeywords) {    String keyword = str;    String actioncl = keywordvsac.get(keyword);    String objectcl = keywordvsor.get(keyword);    Class<?> cls = Class.forName("actions."+actioncl);    Method methodcall = cls.getDeclaredMethod(keyword);    Parameter[] parameters = methodcall.getParameters();            System.out.println(Arrays.toString(parameters));}
查看完整描述

2 回答

?
慕的地6264312

TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超6個(gè)贊

要通過(guò)反射調(diào)用方法,您需要三件事:

  1. 對(duì)象的類(lèi)名

  2. 為其調(diào)用方法的類(lèi)實(shí)例

  3. 方法參數(shù)。

直接從官方文檔中拿一個(gè)例子,調(diào)用一個(gè)方法只需寫(xiě):

   Class<?> c = Class.forName(args[0]);

    Class[] argTypes = new Class[] { String[].class };

    Method main = c.getDeclaredMethod("main", argTypes);

    String[] mainArgs = Arrays.copyOfRange(args, 1, args.length);

    System.out.format("invoking %s.main()%n", c.getName());

    main.invoke(null, (Object)mainArgs);

要顯示參數(shù)名稱(chēng),只需查閱java官方文檔的另一頁(yè),討論它。


我希望它有幫助。


查看完整回答
反對(duì) 回復(fù) 2021-11-17
?
慕尼黑的夜晚無(wú)繁華

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超6個(gè)贊

您可以使用AdminLogin.class.getDeclaredMethods()for 循環(huán)將所有方法映射到某些操作,然后您可以使用讀取參數(shù),method.getParameters()但請(qǐng)注意參數(shù)可能沒(méi)有名稱(chēng) - 這必須在編譯器中使用-parameters標(biāo)志啟用。


概念證明:


Map<String, Callable> mappedMethods = new HashMap<>(); // you can use runnable etc, I used callable as I don't want to catch exceptions in this example code - you should.

AdminLogin instance = new AdminLogin();

WebElement usernameElement = null; // idk how you get instance of this

WebElement passwordElement = null; // idk how you get instance of this

for (Method method : AdminLogin.class.getDeclaredMethods()) {

   Parameter[] parameters = method.getParameters();

   Object[] args = new Object[parameters.length];

   for (int i = 0; i < parameters.length; i++) {

       Parameter parameter = parameters[i];

       if ((parameter.getType() == WebElement.class) && parameter.getName().equals("username")) {

           args[i] = usernameElement;

       }

       else if ((parameter.getType() == WebElement.class) && parameter.getName().equals("password")) {

           args[i] = passwordElement;

       } else {

           // log some info/throw exception, whatever you need for methods that can't be mapped

           break;

       }

   }

   mappedMethods.put(method.getName(), () -> method.invoke(instance, args));

}

現(xiàn)在您可以從地圖中按名稱(chēng)調(diào)用可調(diào)用對(duì)象。


但是請(qǐng)注意,您應(yīng)該在此處添加更多抽象,因?yàn)槿绻懈鄥?shù)類(lèi)型來(lái)處理或?yàn)槊總€(gè)類(lèi)復(fù)制此代碼,則 ifs 之墻將是一個(gè)壞主意。

另請(qǐng)閱讀 Java 中的注解,它們對(duì)于標(biāo)記這樣的特殊方法和參數(shù)很有用,但不要過(guò)度使用它們。


另請(qǐng)注意,getDeclaredMethods返回方法沒(méi)有特定的順序,并且肯定與類(lèi)中聲明的順序不同。


查看完整回答
反對(duì) 回復(fù) 2021-11-17
  • 2 回答
  • 0 關(guān)注
  • 301 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)