谁能解释这段代码我对java有点陌生
Class c = Class.forName(telephony.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
这称为反射。它在运行时而不是编译时访问类、对象和方法。它也不是特定于 Android 的。
“Java 的反射 API 可以在运行时检查类、接口、字段和方法,而无需在编译时知道类、方法等的名称。还可以实例化新对象、调用方法和获取/设置字段使用反射的值。”
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之类的方法,以获取该类声明的参数中给定的方法。
查看此以获取更多信息
telephony.getClass().getName()
提取包含 object 的完全限定类名的字符串telephony
。
Class.forName(...)
使用完全限定名称检索 Class 对象。
c.getDeclaredMethod("getITelephony")
通过反射检索Method
命名的"getITelephony"
.
顺便说一句,所有这些都可以重写如下:telephony.getClass().getDeclaredMethod("getITelephony")
这将返回与telephony
变量关联的类的名称:
telephony.getClass().getName()
这将返回对具有您之前获得的名称的类的引用:
telephony.getClass().getName()
这是没有意义的,因为你可以这样做:
Class c = telephony.getClass();
第二行返回对表示类方法的Method
对象的引用。getITelephony
c
可能您正在尝试在android中自动接听来电...
但重要的一点是,谷歌现在已经阻止了这一点,因为 ITelephony 是一个私有 API。
如果您决定这回答了您的问题,请将其标记为“已接受”。这将提高您和我的声誉分数。