将静态方法作为参数发送,并在Java中的另一个方法中进行一般调用

将静态方法作为参数发送,并在Java中的另一个方法中进行一般调用,java,oop,generics,methods,polymorphism,Java,Oop,Generics,Methods,Polymorphism,我想使用来自一个类(一种类型)的静态方法 将它们发送到不同类中的另一个方法,然后 在不同类的方法中调用它们,而不显式使用它们的名称 以便使调用通用 有没有办法实现这个功能?一些伪代码有助于举例说明我要做的事情: public class A { public static void aMethod1() { //do something } public static void aMethod2() {

我想使用来自一个类(一种类型)的静态方法

  • 将它们发送到不同类中的另一个方法,然后
  • 在不同类的方法中调用它们,而不显式使用它们的名称
  • 以便使调用通用

    有没有办法实现这个功能?一些伪代码有助于举例说明我要做的事情:

    public class A
    {
         public static void aMethod1()
         {
              //do something
         }
    
         public static void aMethod2()
         {
              //do something else
         }
    }
    
    public class B
    {
         public void bMethod(<Parameter that can take any of A's methods polymorphically>)
         {
              <call ANY method sent in by the parameter with the same line of code>
         }
    }
    
    public class Main
    {
         public static void main(String[] args)
         {
              A obj_A = new A();
              B obj_B = new B();
              obj_B.bMethod(<Send any of A's methods>);
         }
    }
    
    公共A类
    {
    公共静态void aMethod1()
    {
    //做点什么
    }
    公共静态void aMethod2()
    {
    //做点别的
    }
    }
    公共B级
    {
    公共无效b方法();
    }
    }
    
    我可能走上了完全错误的道路,但这是我想象中可能会发生的事情。提前感谢您的帮助。

    使用方法参考: 宣布:

    public class B
    {
         public void bMethod(Runnable runnable)
         {
              runnable.run();
         }
    }
    
    public class B {
         public void bMethod(Method method) {
              try {
                  method.invoke(null)
              }
              catch (Exception e) {
                  throw new RuntimeException(e);
              }
         }
    }
    
    现在转到
    bMethod()

    使用反射 宣布:

    public class B
    {
         public void bMethod(Runnable runnable)
         {
              runnable.run();
         }
    }
    
    public class B {
         public void bMethod(Method method) {
              try {
                  method.invoke(null)
              }
              catch (Exception e) {
                  throw new RuntimeException(e);
              }
         }
    }
    
    现在将方法传递给
    bMethod()


    你可以通过反射来实现

    public void bMethod(String name) throws NoSuchMethodException,
      InvocationTargetException,
      IllegalAccessException {
        A.class.getMethod(name).invoke(null);
    }
    
    其中,
    name
    是方法的名称(可以是
    aMethod1
    aMethod2

    然而,这不是一种真正的OOP方法,您应该真正使用其他方法。例如,定义一个名为
    Behavior

    interface Behavior {
      void run();
    }
    
    然后创建此接口的两个不同实现

    class BehaviorA implements Behavior {
      @Override
      public void run() {
        // Behavior A
      }
    }
    
    class BehaviorB implements Behavior {
      @Override
      public void run() {
        // Behavior B
      }
    }
    
    现在,您的
    B方法
    B
    类中的签名可以如下所示:

    void bMethod(Behavior b);
    

    瞧!您现在可以将两种不同的行为传递给方法,而无需使用丑陋的基于反射的hack。

    在Java中,方法不是像其他一些语言中那样可以传递的对象。您可能正在寻找的是接口,尽管这对静态方法没有帮助。如果您可以使用Java8,您可能希望了解接口上的默认方法。这可能会让您更接近。您应该查找函数接口,它们完全可以执行您想要的操作,除了该方法没有在另一个类中声明之外,它不完全是您想要的,但可能是您可以执行的最好的操作。@Cyper实际上从Java 8开始,您可以将方法作为对象传递。语法有点不可靠,但它works@Mshnik你知道这个功能叫什么吗?我想看一看。静态方法在所有类型的a中将保持不变。。您可以只调用.method1(),而不必使用任何对象。这是我的做法,但他似乎特别希望
    b方法(…)
    只获取
    A
    中声明的方法引用,而不从其他任何地方获取。@Mshnik。OP没有明确地说。可能也很有帮助,非常感谢!方法引用正是我想要的。