IllegalAccessException:尝试使用反射访问隐藏类

时间:2018-01-30 23:02:38

标签: java android

我试图从以下位置创建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。关于如何解决这个问题的任何指导?

3 个答案:

答案 0 :(得分:0)

StatusBarManager只能由其包中的其他类构建(例如 package-private )。这意味着您需要通过其他方法访问它。

答案 1 :(得分:0)

我的第一个倾向是说“不要那样做”。具体而言,不要尝试访问或使用平台API的私有私有类,方法,构造函数或字段,也不要尝试访问任何第三方API的私有类,方法,构造函数或字段。您打算使用的类和成员是public,或最多protected

假设你仍然坚持要继续前进,如果你想调用一个你没有正常访问权限的构造函数,那么,正如你所发现的那样,反射不会自动授予你访问权限。但是你可以反思地获得访问权限。要通过该私有构造函数反射性地实例化该类,您需要先在setAccessible(true)对象上调用Constructor,然后再调用newInstance()

答案 2 :(得分:0)

您需要使用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版本的时刻或具有自定义功能的Android   OEM的实施。