簡體   English   中英

將靜態方法作為參數發送,並在Java中的另一個方法中進行通用調用

[英]Send static methods as parameter and generically call within another method in Java

我想使用一個類(一種類型)中的靜態方法,

  1. 將它們發送到另一個類中的另一個方法,並且
  2. 在不明確使用其名稱的情況下,在不同類的方法中調用它們

以使調用通用

有沒有辦法實現這個功能? 一些偽代碼有助於舉例說明我正在嘗試做的事情:

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>);
     }
}

我可能走錯了路,但這就是我想象的可能。 感謝您的幫助。

使用方法參考:

宣布:

public class B
{
     public void bMethod(Runnable runnable)
     {
          runnable.run();
     }
}

現在將方法引用傳遞給bMethod()

new B().bMethod(A::aMethod1);
new B().bMethod(A::aMethod2);

用反射

宣布:

public class B {
     public void bMethod(Method method) {
          try {
              method.invoke(null)
          }
          catch (Exception e) {
              throw new RuntimeException(e);
          }
     }
}

現在通過反射將方法傳遞給bMethod()

new B().bMethod(A.class.getMethod("aMethod1"));
new B().bMethod(A.class.getMethod("aMethod2"));

好吧,你可以用反射來實現。

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類中的bMethod簽名可以如下所示:

void bMethod(Behavior b);

瞧! 您現在可以將兩種不同的行為傳遞給您的方法,而不使用丑陋的基於反射的黑客攻擊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM