面向對象編程 - java動態加載和類型轉換問題?
問題描述
我有 A1.java, A2.java, A3.java ... A10.java 等十個類(也許更多);
他們里面都有一個public static String getResponse()的方法,不過里面所做的事情和回復的字符串都不一樣;
我還有一個變量 String name = 'A1';,不確定變量里面的到底是哪一個類的名字,不過肯定是這是個類里面的一個。
我想當我收到這個name變量之后動態調用所對應的類的getResponse方法,而且不想用if-else一個個判斷。
試了下下面的代碼,forName回復的是一個class對象,好像不能強制類型轉換。能轉換也不知道到底轉換成哪一個對象,我不想一個個if-else判斷。
String result = Class.forName(name).getResponse();我應該怎么做呢? 有沒有好的建議?
問題解答
回答1:這個就是 Java 反射的運用吧.首先你需要通過 Class.forName 獲取一個類的 Class 對象, 然后通過這個 Class 對象的 getMethod 方法獲取指定的方法對象(Method), 最后通過這個 Method 對象來調用此方法.用源碼表示:
public class Test { public static String getResponse() {return 'This is Test.getResponse'; } public static void main(String[] args) throws Exception {String name = 'com.test.Test';String methodName = 'getResponse';Class<?> threadClazz = Class.forName(name);Method method = threadClazz.getDeclaredMethod(methodName);System.out.println(method.invoke(null)); }}回答2:
class.forName獲取的就是類對象。然后你可以通過這個類對象的getMethod方法獲取對應的方法。然后invoke對應的方法
回答3:能否讓這10多個類都實現一個接口,比如
public interface A0 { public String getResponse();}
然后A1、A2...都implements A0,并實現getResponse(只是不能定義成static了)。
然后就能這么寫了:
String result = ((A0) Class.forName(name).newInstance()).getResponse();回答4:
除了反射以外,用Spring也可以。根絕獲得的字符串去get一個bean,然后調用方法。
相關文章:
1. mysql - 分庫分表、分區、讀寫分離 這些都是用在什么場景下 ,會帶來哪些效率或者其他方面的好處2. javascript - vue2.0中,$refs對象為什么用駝峰的方式獲取不到屬性?3. python bottle跑起來以后,定時執行的任務為什么每次都重復(多)執行一次?4. javascript - 求幫助 , ATOM不顯示界面!!!!5. html5 - HTML代碼中的文字亂碼是怎么回事?6. javascript - vue2如何獲取v-model變量名7. javascript - ios返回不執行js怎么解決?8. javascript - 能否讓vue-cli的express修改express重啟服務9. javascript - angular使從elastichearch中取出的文本高亮顯示,如圖所示10. python - 爬蟲模擬登錄后,爬取csdn后臺文章列表遇到的問題
