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