为啥这个 Java 方法只能使用反射?

Posted

技术标签:

【中文标题】为啥这个 Java 方法只能使用反射?【英文标题】:Why is this Java method available only using reflection?为什么这个 Java 方法只能使用反射? 【发布时间】:2013-06-05 08:01:16 【问题描述】:

我是反射新手,事实上,在遇到以下问题之前我从未使用过它 -

我尝试使用在名为 Resources 的类中定义的名为 getCompatibilityInfo 的方法,但我看到这样做的唯一方法是这样调用它:

Resources.class.getMethod("getCompatibilityInfo");

我可以使用称为getResources() 的方法获取资源实例,那么为什么不能使用getResources().getCompatibilityInfo() 访问它?

类源码为here

谢谢!

【问题讨论】:

因为实例化资源是不够的。看过代码,知道构造函数有一定的参数,而空的构造函数是私有的,因为它只为System资源服务。 因为@hide注解见***.com/questions/7888191/… @Heuster,它无法编译。 farincz,我正在寻找有关 @hide 注释的更多信息。谢谢。 【参考方案1】:

Resources 没有空的公共构造函数。所以new Resources() 会给你一个编译时错误,getCompatibilityInfo() 也不是公共 API 的一部分

【讨论】:

你说得对,我忘记写对了。我编辑了我的问题,现在我使用 getResources 来获取一个实例。尽管如此,它还是没有编译...【参考方案2】:

这只有在 android 中才会发生,因为 android.jar 已删除所有标有 @hide 的方法。这仅在编译时很重要,因为 android.jar 仅用于开发。

this answer上的详细解释。

【讨论】:

以上是关于为啥这个 Java 方法只能使用反射?的主要内容,如果未能解决你的问题,请参考以下文章

java 通过反射怎么获取方法中参数值

Java中的Class类的newinstance方法返回值为啥是object类型的?

为啥 Java 反射 API 允许我们访问私有和受保护的字段和方法?这不会破坏访问修饰符的目的吗? [复制]

为啥 main 方法需要是静态的? [复制]

Java 反射详解

Java 反射的理解