首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IllegalAccessException:尝试使用反射访问隐藏类

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

Stack Overflow用户
提问于 2018-01-31 07:02:38
回答 3查看 562关注 0票数 0

我正在尝试从http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.3_r1/android/app/StatusBarManager.java#StatusBarManager创建一个StatusBarManager实例

下面是我用来做这件事的代码:

代码语言:javascript
复制
    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。有什么关于如何去做的指导吗?

EN

回答 3

Stack Overflow用户

发布于 2018-01-31 07:07:17

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

票数 0
EN

Stack Overflow用户

发布于 2018-01-31 07:11:51

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

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

票数 0
EN

Stack Overflow用户

发布于 2018-01-31 07:25:08

您需要使用setAccessible(true)

对我来说,这段代码是正确编译的:

代码语言:javascript
复制
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();
}

免责声明:如果你这样做了,你必须知道你的代码可以在任何时候中断不同的安卓版本,或者在安卓系统中通过OEM的自定义实现。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48531911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档