[英]IllegalAccessException: Try to access hidden class using reflection
我正在嘗試從以下位置創建StatusBarManager的實例: http : //grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.3_r1/android/app/StatusBarManager.java #StatusBarManager
這是我正在使用的代碼:
try {
Class<?> c = Class.forName("android.app.StatusBarManager");
Object object = c.getDeclaredConstructor(Context.class).newInstance(context);
Method m = c.getDeclaredMethod("expandNotificationsPanel",(Class<?>[]) null);
try {
m.invoke(object, (Object[]) null);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
但是,在嘗試創建構造函數時,我得到了IllegalAccessException。 有關如何進行此操作的任何指導?
StatusBarManager
只能由其包中的其他類構造(例如, package-private )。 這意味着您需要通過其他方法來訪問它。
我的第一個傾向是說“不要那樣做”。 具體來說,請勿嘗試或使用平台API或任何第三方API的私有私有類,方法,構造函數或字段。 您打算使用的類和成員是public
,或者最多是protected
。
假設您無論如何都要堅持下去,如果您要調用一個通常無法訪問的構造函數,那么,正如您所發現的,反射不會自動授予您訪問權限。 但是您可以反省地獲取訪問權限。 要通過該私有構造函數反射性地實例化該類,您需要首先在調用newInstance()
之前在Constructor
對象上調用setAccessible(true)
newInstance()
。
您需要使用setAccessible(true)
對我來說,這段代碼可以正確編譯:
try {
//get the Class for the StatusBarManager
Class className = Class.forName("android.app.StatusBarManager");
Constructor constructor = className.getDeclaredConstructor(Context.class);
Method m = className.getDeclaredMethod("expandNotificationsPanel",(Class<?>[]) null);
//set the constructor accessible and build an instance of it
constructor.setAccessible(true);
Object statusBarManager = constructor.newInstance(context);
//invoke the method
m.invoke(statusBarManager, (Object[]) null);
} catch (InstantiationException |
InvocationTargetException |
NoSuchMethodException |
IllegalAccessException |
ClassNotFoundException e) {
e.printStackTrace();
}
免責聲明 :如果執行此操作,則必須知道您的代碼可能隨時會因使用不同的Android版本或通過OEM的自定義實現而中斷。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.