无法理解反思

时间:2012-08-15 07:28:57

标签: java android

任何人都可以解释这段代码我是java的新手

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

5 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:3)

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

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

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

getDeclaredMethod()

第二步是调用getDeclaredMethod之类的方法来获取类声明的参数中给出的方法。

请查看此信息以获取更多信息Reflection

答案 2 :(得分:2)

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

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

c.getDeclaredMethod("getITelephony")通过反射检索名为Method的{​​{1}}。

BTW所有这些可以重写为:"getITelephony"

答案 3 :(得分:1)

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

telephony.getClass().getName()

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

telephony.getClass().getName()

这有点毫无意义,因为你可以这样做:

Class c = telephony.getClass();

第二行返回对Method类的getITelephony对象的引用。

答案 4 :(得分:0)

可能你正试图在android中自动接收来电...

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

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