使用某个字符串在运行时调用方法

问题描述 投票:1回答:3

我是新手,我需要一个解决方案或想法,我该怎么做

我有以下代码:

if (page.getId().equals("STEP_NAME_SUBMIT_OTP_FOR_TRANSACTION"))
    emRequestResponse.setTagElementList(agent.getHeader().getTagElementList().getSTEP_NAME_SUBMIT_OTP_FOR_TRANSACTION());
else if (page.getId().equals("STEP_NAME_SUBMIT_CAPTCHA_FOR_LOGIN"))
    emRequestResponse.setTagElementList(agent.getHeader().getTagElementList().getSTEP_NAME_SUBMIT_CAPTCHA_FOR_LOGIN());

我需要一个更好的方法在运行时根据id调用该方法,所以如果名称是STEP_NAME_SUBMIT_OTP_FOR_TRANSACTION我需要调用方法getSTEP_NAME_SUBMIT_OTP_FOR_TRANSACTION,依此类推。

java
3个回答
2
投票

您可以调用如下代码的方法:

try {
Method method = emRequestResponse.getDeclaredMethod("method name", parameterTypes);
method.invoke(objectToInvokeOn, params);
} catch(Exception ex) {
System.out.println(ex.toString());
}

0
投票

你可以使用switch而不是if-elseswitchif-else表现得更好。

开关性能会更好,因为在开关的情况下会有一次性评估。一旦它评估了交换机,它就知道需要执行哪种情况,但是如果是,否则它必须在最坏的情况下通过所有条件。

在大量条件的情况下,切换性能会更好,但对于更短的列表(仅两个条件),它也可能更慢


0
投票

你的问题的答案是java的REFLECTION API。

我建议使用switch case作为你的字符串,因为,根据你的要求,我看到字符串可以制作final

使用Method类,您可以通过填充方法名称和必需参数来调用方法。

假设您要调用的方法在名为TagElementsList的类中定义,以下代码块应该为您完成。

private List invokeMethod(TagElementsList tagElementsList, String pageId) {
    Method method = TagElementsList.class.getMethod("get"+pageId);
    List returnList = (TagElementsList)method.invoke(tagElementsList);
    return returnList;
}

因此,您可以通过以下调用从代码中的所需位置调用invokeMethod方法来使方法按照您的需要工作,考虑到上述方法在同一个类中声明为必须的位置。调用。您当然可以将其定义在不同的类中,并通过该类的实例调用该方法。

List list = invokeMethod(agent.getHeader().getTagElementList(), page.getid());
 emRequestResponse.setTagElementList(list);
© www.soinside.com 2019 - 2024. All rights reserved.