簡體   English   中英

IllegalAccessException:嘗試使用反射訪問隱藏的類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM