簡體   English   中英

Java反射尋找方法

[英]Java reflection finding method

我在使用 Java 查找方法時遇到問題,例如,我必須通過反射將值打印到 System.out:

public static void print(Object value) {
    Method method = PrintStream.class.getMethod("print", value.getClass());
    method.invoke(System.out, value);
}

它適用於字符串,但是當我傳遞MyClass的實例時,例如,我收到以下錯誤:

java.lang.NoSuchMethodException: java.io.PrintStream.print(MyClass)
    at java.lang.Class.getMethod(Class.java:1786)
    at Test.print(Test.java:20)
    at Test.main(Test.java:15)

我相信那是因為 Java 找不到具有確切簽名的方法,但這里java.io.PrintStream.print(java.lang.Object)適合如何找到適合以下類的方法,而不僅僅是具有相同的簽名? 該方法也應該適用於多個 arguments。

我相信那是因為 Java 找不到具有確切簽名的方法...

那是對的。 反射 API 不支持這一點。 在反射性地查找方法時,沒有簡單的方法可以復制 Java 的(靜態)方法重載決議。

不簡單的方法是:

  1. 識別MyClass實現的所有類和接口。 (你可以反思地做到這一點。)
  2. 為每個 class / 接口類型調用PrintStream.class.getMethod("print", type)
  3. 如果您從第 2 步得到多個結果,請使用一些啟發式方法來確定哪種方法是“最好的”方法。 (它不一定是反映 JLS 所做的事情,盡管這可能是“最不令人驚訝”的使用方法。)

有 3rd 方庫可以為您執行此操作; 看看這個問答以獲得一些建議:

假設您有一個名為 PrintStream 的 class 具有兩種方法:

public class PrintStream {


public static void invoker(Class o, String methodName) {
    Method method = null;
    try {
        method = o.getMethod(methodName, null);
        method.invoke(o.newInstance());
    } catch (NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) {
        e.printStackTrace();
    }
}

public static void print(Class o, String methodName) {
    Method method = null;
    try {
        method = o.getMethod(methodName, int.class, int.class);
        System.out.println(method.invoke(o.newInstance(), 3, 2));
    } catch (NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) {
        e.printStackTrace();
    }
  }

和一個隨機的 class 有兩種方法:

public class RandomClass {

    public static void printTest(){
      System.out.println("Method just invoked");
    }

   public int sumFunc(int a, int b){
     return a+b;
   }
}

從您的主要 class 只需從 PrintStream 調用輔助方法

 PrintStream.invoker(RandomClass.class, "printTest");
 PrintStream.print(RandomClass.class, "sumFunc");

暫無
暫無

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

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