-1

谁能解释这段代码我对java有点陌生

Class c = Class.forName(telephony.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
4

5 回答 5

4

这称为反射。它在运行时而不是编译时访问类、对象和方法。它也不是特定于 Android 的。

“Java 的反射 API 可以在运行时检查类、接口、字段和方法,而无需在编译时知道类、方法等的名称。还可以实例化新对象、调用方法和获取/设置字段使用反射的值。”

http://tutorials.jenkov.com/java-reflection/index.html

于 2012-08-15T07:32:46.580 回答
3

Java 反射允许正在执行的 Java 程序检查或“自省”自身,并操纵程序的内部属性。例如,Java 类可以获取其所有成员的名称并显示它们。

调用 会Class.forName("X")导致名为 X 的类被动态加载(在运行时)。对 forName("X") 的调用会导致初始化名为 X 的类(即,JVM 在类加载后执行其所有静态块)。Class.forName("X")返回与“X”类关联的 Class 对象。返回的 Class 对象不是“x”类本身的实例。

Class.forName("X")如果尚未加载,则加载该类。JVM 会跟踪以前加载的所有类。此方法使用调用它的类的类加载器。“X”是所需类的完全限定名称。

getDeclaredMethod()

第二步是调用诸如getDeclaredMethod之类的方法,以获取该类声明的参数中给定的方法。

查看此以获取更多信息

于 2012-08-15T07:33:46.103 回答
2

telephony.getClass().getName()提取包含 object 的完全限定类名的字符串telephony

Class.forName(...)使用完全限定名称检索 Class 对象。

c.getDeclaredMethod("getITelephony") 通过反射检索Method命名的"getITelephony".

顺便说一句,所有这些都可以重写如下:telephony.getClass().getDeclaredMethod("getITelephony")

于 2012-08-15T07:33:35.987 回答
1

这将返回与telephony变量关联的类的名称:

telephony.getClass().getName()

这将返回对具有您之前获得的名称的类的引用:

telephony.getClass().getName()

这是没有意义的,因为你可以这样做:

Class c = telephony.getClass();

第二行返回对表示类方法的Method对象的引用。getITelephonyc

于 2012-08-15T07:34:16.117 回答
0

可能您正在尝试在android中自动接听来电...

但重要的一点是,谷歌现在已经阻止了这一点,因为 ITelephony 是一个私有 API。

如果您决定这回答了您的问题,请将其标记为“已接受”。这将提高您和我的声誉分数。

于 2012-08-15T08:38:11.547 回答