我正在尝试从http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.3_r1/android/app/StatusBarManager.java#StatusBarManager创建一个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。有什么关于如何去做的指导吗?
发布于 2018-01-31 07:07:17
StatusBarManager只能由其包中的其他类构造(例如,它是package-private).这意味着您需要通过其他方法访问它。
发布于 2018-01-31 07:11:51
我的第一个倾向是说“不要那样做”。具体地说,不要尝试访问或使用平台API的私有类、方法、构造函数或字段,也不要尝试访问或使用任何第三方API的私有类、方法、构造函数或字段。您打算使用的类和成员是public,或者至多是protected。
假设你无论如何都要坚持下去,如果你想调用一个你没有正常访问权限的构造函数,那么,正如你所发现的,反射不会自动授予你访问权限。但您可以反射性地获取访问权限。要通过该私有构造函数反射地实例化该类,您需要首先在Constructor对象上调用setAccessible(true),然后再调用newInstance()。
发布于 2018-01-31 07:25:08
您需要使用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();
}免责声明:如果你这样做了,你必须知道你的代码可以在任何时候中断不同的安卓版本,或者在安卓系统中通过OEM的自定义实现。
https://stackoverflow.com/questions/48531911
复制相似问题