代码:
Method[] declaredMethods = Class.forName("android.widget.NumberPicker").getDeclaredMethods();
for (Method method:declaredMethods) {
	Logger.e(method.toString()); 
}
我查看了 Log ,一个 private 的方法都没有,google 百度无果,自行查询研究无果,特来求教,另外获取私有属性倒是正常的,就是私有方法不行。
问题来源,最开始是想获取单个私有方法,就是这个 validateInputTextView 私有方法,发现报错 NoSuchMethodException ,无论怎么获取测试都是这样,所以就决定把所有方法都打印出来,结果里面一个私有方法都没有。
不是Kubuntu的问题,这个问题是Google Android的问题,而且正因为如此无解,Google在Android 9(API 级别 28)加了限制,无法访问私有方法,当然targetSdkVersion低于28是可以的,往上就不行。
我很气愤,它限制这个做啥?说什么提高稳定性,他就觉得要用到反射来做些事情的人是菜鸟吗,我实说我是想帮它NumberPicker优化点逻辑,细节方面不到位,我给其私有字段设置了监听器,然后还需要用到一个私有方法,于是就有了今天的问题。
真的很气人。
https://developer.android.com/guide/app-compatibility/restrictions-non-sdk-interfaces
|      1Jooooooooo      2022-01-04 16:42:52 +08:00 是不是引的包有冲突. | 
|      2xia0pia0      2022-01-04 16:51:10 +08:00 Method method = object.getClass().getDeclaredMethod(methodName); method.setAccessible(true); Object r = method.invoke(object); SecurityManager 可能会拦截掉 setAccessible | 
|      3nnegier OP @Jooooooooo 正常运行 | 
|      4nnegier OP @xia0pia0 关键是 getDeclaredMethods 里面就没有私有的方法,我全部打印出来看过了,setAccessible 、invoke 啥的都是后话了,前面就失败了 | 
|      5aguesuka      2022-01-04 18:07:43 +08:00 | 
|      7junas7      2022-01-04 18:47:32 +08:00 私有方法写在 android.widget.NumberPicker 的父类? | 
|  |      8janstk      2022-01-04 18:53:44 +08:00 hidden-api 限制? | 
|      11yescpu      2022-01-04 19:08:24 +08:00 怎么确定代码里面有?是不是 Android Studio 里面点源码里面看能看到这个方法? 但这不意味着 App 运行的 framework 中也一定有这个方法,如果你排除 hide 了的情况的话可能的原因是定制 rom 把这个方法干掉了。 | 
|      12e99unc1e      2022-01-04 19:10:20 +08:00 我刚刚在自己设备上也试了下,MIUI12 Android 9 ,也没有这个方法,有可能是编译的时候优化掉了吗。 | 
|  |      13codehz      2022-01-04 19:19:14 +08:00 via Android 你把 framework 从设备里提取出来反编译一下试试? | 
|      14essicaj      2022-01-04 19:28:23 +08:00 一个 private 的方法都没有,确实有点奇怪。我试了下我手上的 android 11 的设备,和你一样的代码是能取到 validateInputTextView 这个方法的。或许和设备有点关系? | 
|      15nnegier OP | 
|      16e99unc1e      2022-01-04 19:34:55 +08:00 @nnegier 编译的时候可能会有部分方法被优化掉,比如内联之类的,源代码里面有不代表最终产物有。我赞成 13 楼的建议,吧 framework jar 之类的东西提取出来看看里面的情况。 另外我不太确定是不是内联的原因是,私有方法确实都没了。如果是仅仅被一次使用的私有方法没有出现,那被内联的可能性还是很大的,但是我看还有挺多是多处被使用的私有方法。 | 
|  |      17lxxself      2022-01-04 19:53:45 +08:00 蹲一个结果 | 
|      18yiranshaxiao      2022-01-04 22:00:00 +08:00 Accessing hidden method Landroid/widget/NumberPicker;->validateInputTextView(Landroid/view/View;)V (greylist-max-o, reflection, denied) | 
|      22nnegier OP @yiranshaxiao 高手 |