0
調用內部類的方法,我有以下的代碼,我得到實例化異常,當我調用newInstnace()使用反射的Android的Java越來越InstantiationException
能否請你幫
Class cls = Class.forName("com.android.internal.os.BatteryStatsImpl$Uid");
Object obj = cls.newInstance();
調用內部類的方法,我有以下的代碼,我得到實例化異常,當我調用newInstnace()使用反射的Android的Java越來越InstantiationException
能否請你幫
Class cls = Class.forName("com.android.internal.os.BatteryStatsImpl$Uid");
Object obj = cls.newInstance();
除非內類聲明爲static
,如果沒有它所屬的外部類的實例,則無法創建內部類的實例。一旦你有了其中的一個,那麼你需要使用反射來獲得內部類的構造函數。請注意,這從文檔Class.getConstructor
:
如果
Class
對象表示非靜態上下文中聲明的內部類,形式參數類型包括明確的類實例作爲第一個參數。
最後,您需要調用構造方法的newInstance
方法,將外部類的實例作爲第一個參數傳遞給它。
隨着外圍類的一個實例,你實際上並不需要反思:
BatteryStatsImpl stats = . . .;
com.android.internal.os.BatteryStatsImpl.Uid obj = stats.new Uid();
編輯每請求時,這裏的一些示例代碼(有沒有錯誤檢查):
Class<?> statsClass = Class.forName("com.android.internal.os.BatteryStatsImpl");
Object statsObject = statsClass.newInstance();
Class<?> uidClass = Class.forName("com.android.internal.os.BatteryStatsImpl$Uid");
Constructor<?> ctor = uidClass.getConstructor(statsClass);
Object uidObject = ctor.newInstance(statsObject);
當然,請注意,因爲所有這些都是Android內部組件的一部分(而不是已發佈的API的一部分),它帶有一個標準的「自擔風險使用」警告:您正在使用的課程可能會更改(或失蹤)在未來ve的通知Android的rsions。
你能否提供一些你提到的步驟的示例代碼 – mSO
@Manish - 完成。 –
在線構造器> ctor = uidClass.getConstructor(statsClass);異常提出了類型null – mSO