[英]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 的(靜態)方法重載決議。
不簡單的方法是:
MyClass
實現的所有類和接口。 (你可以反思地做到這一點。)PrintStream.class.getMethod("print", type)
。有 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.