如何檢查Java中的類是否存在方法? try {...} catch {...}
聲明是否是一種好的做法?如何檢查Java中運行時是否存在方法?
回答
我假設你要檢查的方法doSomething(String, Object)
。
你可以試試這個:
boolean methodExists = false;
try {
obj.doSomething("", null);
methodExists = true;
} catch (NoSuchMethodError e) {
// ignore
}
這是行不通的,因爲該方法將在編譯時得到解決。
你真的需要爲它使用反射。如果您有權訪問要調用的方法的源代碼,則最好使用要調用的方法創建接口。
[更新]附加信息是:有一個接口可能存在兩個版本,一個是舊的(沒有想要的方法)和一個新的(使用想要的方法)。在此基礎上,我建議如下:
package so7058621;
import java.lang.reflect.Method;
public class NetherHelper {
private static final Method getAllowedNether;
static {
Method m = null;
try {
m = World.class.getMethod("getAllowedNether");
} catch (Exception e) {
// doesn't matter
}
getAllowedNether = m;
}
/* Call this method instead from your code. */
public static boolean getAllowedNether(World world) {
if (getAllowedNether != null) {
try {
return ((Boolean) getAllowedNether.invoke(world)).booleanValue();
} catch (Exception e) {
// doesn't matter
}
}
return false;
}
interface World {
//boolean getAllowedNether();
}
public static void main(String[] args) {
System.out.println(getAllowedNether(new World() {
public boolean getAllowedNether() {
return true;
}
}));
}
}
此代碼測試方法getAllowedNether
是否在接口存在,所以沒關係的實際對象是否有方法還是不行。
如果方法getAllowedNether
必須經常調用,並且因此遇到性能問題,我將不得不考慮更高級的答案。這一個應該現在罰款。
在java中,這被稱爲反射。該API允許您發現方法並在運行時調用它們。這是一個指向文檔的指針。這是相當冗長的語法,但它會完成這項工作:
http://java.sun.com/developer/technicalArticles/ALT/Reflection/
鏈接不再有效。 – mikiqex
當使用Class.getMethod(...)
函數時,反射API拋出NoSuchMethodException
。
否則Oracle有大約反射一個很好的教程http://download.oracle.com/javase/tutorial/reflect/index.html
我會用一個單獨的方法來處理異常,並有一個空檢查,檢查方法存在
例:如果(空= getDeclaredMethod( obj,「getId」,null))做你的東西...
private Method getDeclaredMethod(Object obj, String name, Class<?>... parameterTypes) {
// TODO Auto-generated method stub
try {
return obj.getClass().getDeclaredMethod(name, parameterTypes);
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
- 1. 如何在運行時檢查類方法是否存在?
- 2. 如何在運行時檢查iOS4中是否存在字體
- 3. 檢查在運行時是否正在執行某個方法
- 4. Java - 如何檢查運行時是否調用動態實例化方法?
- 5. 如何檢查運行時是否存在最低Ruby版本?
- 6. 如何在運行時檢查死java方法
- 7. 編譯時檢查服務是否正在運行的方法
- 8. 如何檢查Java類是否在NetBeans IDE中運行?
- 9. 如何在運行時檢測.NET中是否存在類?
- 10. 在運行時檢查程序中是否存在函數
- 11. 如何檢查我的查詢是否正在ExecuteNonQuery()方法中運行?
- 12. 如何檢查meteor.call方法是否成功運行?
- 13. 如何檢查行是否存在
- 14. 檢查方法是否存在子類
- 15. Laravel 5.2檢查方法是否存在?
- 16. 檢查jQuery的方法是否存在
- 17. 檢查方法是否存在
- 18. 檢查jQuery方法是否存在
- 19. 是否有任何方法來檢查行中是否存在多列的值
- 20. 如何檢查rspec中是否存在輔助方法/變量?
- 21. 如何檢查是否在PowerShell中運行時通過腳本
- 22. 如何檢查我的線程是否正在運行Java
- 23. 檢查行是否存在
- 24. 如何檢查MySQL搜索JOIN查詢時是否存在行?
- 25. 檢查在運行時是否存在UI_USER_INTERFACE_IDIOM
- 26. 檢查圖像中是否存在Java
- 27. 檢查Firebase中是否存在ID [Java]
- 28. 檢查Java中是否存在日期
- 29. 檢查java中是否存在字符
- 30. 如何檢查是否在單獨的線程中執行java Subject.doAs方法?
你使用反射嗎?否則,我不確定你在問什麼... – Neil
try/catch與方法存在有什麼關係?除非你指的是'Iterator'接口,'remove'的實現允許拋出'UnsupportedOperationException'嗎? –
你在談論什麼樣的檢查現有方法?反射? – Jaka