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

Java 在运行时使用某些字符串调用方法,java,Java,我是新来的,我需要一个解决方案或想法,我可以怎么做 我有以下代码: 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(

我是新来的,我需要一个解决方案或想法,我可以怎么做

我有以下代码:

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\u name\u SUBMIT\u OTP\u FOR\u TRANSACTION
,我需要调用方法
getSTEP\u name\u SUBMIT\u OTP\u FOR\u TRANSACTION
等等。

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

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

您可以在
if-else
上使用
switch
switch
的性能优于
if-else

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


在大量情况下,交换机性能会更好,但对于较短的列表(仅两种情况),它也会更慢。您的问题的答案是java的反射API

我建议您对字符串使用
switch case
,因为根据您的要求,我可以将字符串设置为
final

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

假设要调用的方法是在名为
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);

这种方法有什么问题?在运行时可能会有10到15个id,我不希望在其他15次或切换时,我需要一种方法,在这种方法中,我只获取一个id,然后根据该id调用一个方法。所有这些
getXXX
方法都返回相同的类型吗?如果是,那是什么类型?是,所有返回的都是相同的type@ArvindCarpenter你可以试试我的答案。实际上,这些id是在运行时生成的,而相应的方法也是在运行时生成的,所以我不知道在起始位置id是什么,因此在这种情况下,我无法硬编码这些id,如果您知道方法名称和参数值之间的相关性,您可以使用反射api来调用方法是的关系是如果id是STEP_name_SUBMIT_OTP_FOR_TRANSACTION,那么方法名称将是getSTEP_name_SUBMIT_OTP_FOR_TRANSACTION,我猜您可以使用@Chetan Joshi Belown提出的答案。您的案例必须通过下面的行调用getDeclaredMethod emRequestResponse.setTagElementList(agent.getHeader().getTagElementList().geDeclaredMethod();因此参数类型是我们传递给该方法的参数类型,如果是,在我的情况下没有要传递的参数,则我将其保留为null或void@ArvindCarpenter您可以跳过参数,只传递方法名。