android中的反射

来源:互联网 发布:嘉嘉购软件 编辑:程序博客网 时间:2024/05/22 02:12

还是先从一个小故事说起吧:

老大要A,B合伙搞定一个bug,A手脚麻利,思维敏捷,先搞完了自己负责的部分。回头一看B,还没动手呢,由于这个bug是两人共同负责,A必须要调用B的方法和对象。现在B还没开始,A无法结束自己的任务,该怎么办呢?

有那么几种做法:1,帮B完成。2,等B完成。3,管B完不完成

A想了下,第一种有可能吃力不讨好,第二种风险太大,有可能被老大批的,于是,A采用了最有技术含量的第三种方法。

A告诉程序,在你运行到要调用B的方法和对象的时候,去找B的代码去吧。于是A不用管B完成与否,因为他的代码已经不需要修改并能编译通过,也就是他的任务已经完成了,这样A就可以潇洒的走人了。

A完美的完成了任务,而且高效率也让他获得了老大的嘉奖。可是,问题来了,B不服气的问A,你凭什么在能在程序运行时调用我的代码?

OK,主角上场,现在开始A的授课环节:

话说,语言有静态语言和动态语言之分。程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言,很显然,java并不是动态语言。但是,java有一种机制,叫做反射,它允许运行中的Java程序对自身进行检查,并能直接操作程序的内部属性或方法。所以,java也没必要羡慕动态语言。

反射机制允许编程人员在程序运行时来改变程序的结构或者变量的类型。通过这个特性,我们可以在运行时得知某个类的所有成员,包括其属性和方法,同时也能够调用这些方法。请注意反射机制的特殊之处就在于可以使用编译期间完全未知的类,也就是通过反射机制可以加载一个在运行时才得知名字的类,从而取得其内部的成员函数并调用。

好,了解这些,那我们就知道了,我们可以利用反射机制在Java程序中,动态的去调用一些protected甚至是private的方法或类,这样可以很大程度上满足我们的一些比较特殊需求。你当然会问,反射机制在Android平台下有何用处呢?

在Android的源码中,你会发现很多类或方法中经常加上了“@hide”注释标记,它的作用是使这个方法或类在生成SDK时不可见,如果你在你的程序中调用了那些api,你会发现编译不通过,当然,你可以把那个标记去掉,然后重新编译一个SDK载入,或者,你也可以通过使用反射来解决这个问题。

在activity的生命周期内,ActivityThread就多次利用反射来取得类的信息,从而对当前进程的activity进行状态控制。

 

原创粉丝点击