当前位置: 首页 > 知识库问答 >
问题:

Java在一个循环中调用多个选定的方法

裴英才
2023-03-14

我正在寻找一些帮助来优化我的代码并使用更少的行数编写它。我有一个Class say A,它有几个定义的方法,如下所示:

Class A{
    public void doSomethingA(){
    }
    public void doSomethingB(){
    }
    public void doSomethingC(){
    }
    public void verifySomethingXYZ(){
    }
    public void verifySomethingLMN(){
    }
}

现在我有一个单独的类,比如B和方法,编写如下

Class B{
    public void test(){
    }

    public void verifyMyMethods(){

    A objA = new A();
    objA.doSomethingA();
    test();
    objA.doSomethingB();
    test();
    objA.doSomethingC();
    test();
    }
}

所有这些代码都运行良好。我只是想看看是否有更好的方法可以继续调用像objA这样的方法。verifyMyMethods()中的doSomethingA(),因此我可以使用更少的代码行来完成相同的工作。

我想在循环中调用方法doSomethingA()、doSomethingB()、doSomethingC()等。但不确定如何做到这一点。一种方法是使用Java。lang.Class。getMethod()。但这将返回一个类中定义的所有方法。

我确实检查了这个[https://stackoverflow.com/questions/12566107/how-to-call-multiple-methods-using-loop-in-java]exisitng帖子,但我的问题是我只是不想调用A类中定义的所有方法。只有其中的一些。由于我将在B类中调用一些来自A类的10-20个方法,我想以稍微好一点的方式来做这件事。

我在Python中看到了另一种解决方案[https://stackoverflow.com/questions/55458933/how-to-call-multiple-methods-of-a-class-in-a-loop]

name = YourClass()
methods = [name.alex,  name.john, name.claire ] # ...

for m in methods:
    m()

但在Java中如何做到这一点?这是我试过的。但它给出了空指针异常。

public void try(){
    List<String> l = Lists.newArrayList("objA.doSomethingA","objA.doSomethingB","objA.doSomethingC");
    for (String i : l){
        try{
            Method mett =objA.getClass().getMethod(i); // null pointer exception thrown for this line
            mett.invoke(i);
        } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e){
        }
    }

共有2个答案

相化
2023-03-14

只是另一种解决方案:

public class A {
    public void doSomethingA(){
        System.out.println("Calling doSomethingA");
    }
    public void doSomethingB(){
        System.out.println("Calling doSomethingB");
    }
    public void doSomethingC(){
        System.out.println("Calling doSomethingC");
    }
    public void verifySomethingXYZ(){
        System.out.println("Calling verifySomethingXYZ");
    }
    public void verifySomethingLMN(){
        System.out.println("Calling verifySomethingLMN");
    }
}

public class Main {
    public static void main(String[] args) {
        List<String> methodsToCall = new ArrayList<>(Arrays.asList("doSomethingA", "doSomethingB", "doSomethingC"));
        callDesiredMethods(methodsToCall);
    }

    public static void callDesiredMethods(List<String> methodsToCall) {
        Class clazz = A.class;
        Method[] methods = clazz.getMethods();
        for (Method method : methods) {
            if (methodsToCall.contains(method.getName())) {
                try {
                    method.invoke(clazz.newInstance());
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                } catch (InstantiationException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
鲁浩言
2023-03-14

必须将方法调用封装在函数中才能实现这一点。消费者是一个很好的候选人。

表示接受单个输入参数但不返回结果的操作

实现可能如下所示:

class MethodInvocation implements Consumer<A> {

    @Override
    public void accept(A a) {
      a.doSomethingA();
    }
  }

这对于每个方法调用来说都太长了,因为消费者是一个功能接口,所以我们只能使用lambda或方法引用。

public class Temp {

  public static void main(String[] args) throws Exception {
    A objA = new A();
    List<Consumer<A>> consumers = Arrays.asList(a -> a.doSomethingA(), A::doSomethingB, A::doSomethingC);
    for (Consumer<A> consumer : consumers) {
      consumer.accept(objA);
    }
  }
}
 类似资料:
  • 我有一个类(称为name),它有如下不同的方法: alex(), john(), claire(), charles(), luke(), richard(), jen()等等 我需要逐一调用所有这些方法,例如: ... 等等 我尝试的是创建一个名称列表,并调用循环中的所有方法 但这种调用方法的方式正在失败。有没有办法在循环中调用同一类的多个方法?

  • 假设我有一些这样的方法: 但我不想调用序列方法: 这很无聊。如果我添加一个新方法:,我需要添加手动:

  • 我有一个对象,里面有多个嵌套对象。类: 其基础是,一个可以有多个以及它们自己的。我想为每个填充,如下所示: 这是起作用的,但我想用一个递归的方法来做这件事。这可能吗? 根据@johnathan Barclay的建议编辑我使用以下方法: 这有助于获取每个第一个的。现在发生的情况是以下子元素没有填充。

  • 问题内容: 我想知道是否有这样一种方法来遍历java中每个循环的扩展扩展的多个集合。 所以像这样: 谢谢 问题答案: 您可以使用Guava的:

  • 我编写了如下代码,但它没有正确返回第一个重复出现的字母。 示例:在单词“statistics”中,重复出现的字母是s、t和i,但字母t的递归速度比字母s和i快,但我的程序返回s而不是t。 根据手头的任务,使用两个for循环返回t需要做什么?

  • 问题内容: 我在搜索“如何在for循环中提供多个条件?” 但是没有给出直接答案。 经过一番研究,我找到了正确的方法。条件不得以逗号(,)或分号(;)分隔。我们可以使用&&运算符将两个条件结合在一起。 for(初始化; condition1 && condition2;增量) 例: 希望这对新的Java开发人员有所帮助。 问题答案: 您还可以使用“或”运算符,