下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

简析在Android应用开发中如何JAVA反射机制的应用教程

作者:课课家教育     来源: http://www.kokojia.com点击数:1601发布时间: 2016-05-05 14:49:50

标签: Android应用开发JAVA反射机制android反射

  反射是计算机的一种处理方式,它也是程序可以访问、检测和修改它本身状态或行为的一种能力。而成员被类包含,类被模块包含,而模块被程序集包含。然而反射则提供了封装程序集、模块和类型的对象。那么本文主要是介绍在Android应用开发中如何java反射机制的应用。

  学过学过JAVA的人对“反射”这个词一定也没那么陌生吧,不会条件反射地想着是生理的反射吧,哈哈,那么我们简单来了解一下“反射”,反射机制是允许编程人员在程序运行时来改变程序的结构或者变量的类型。也通过这个特性,我们可以在运行时得知某个类的所有成员,包括其属性和方法,同时也能够调用这些方法。但需要注意的是,反射机制的特殊之处就在于它可以使用编译期间完全未知的类,也就是通过反射机制可以加载一个在运行时才得知名字的类,从而取得其内部的成员函数并调用。

  那么下面来通过我准备比赛的过程中遇到的两个例子来说明JAVA强大的反射机制在Android开发中的应用。

  首先来看看第一个例子。如果你有做过安卓App这些应用程序的话,你一定会立即想到的就是App的登陆界面,这个就是最常使用到的,当然App登陆界面的设计也可以是在layout中完成,通过使用Eclipse中的插件来绘制我们的UI。但我突然发现不利用Android外观使用AlertDialog,且在其内嵌入两个EditText和两个Button(其实两个Button无需嵌入,因为AlertDialog可以很方便的使用setPositiveButton、setNeutralButton以及setNegativeButton来添加按钮并配置其listener)

  看下面效果图所示,

登录界面

  可能大家看起来简单的一个功能,可给我带来你所无法控制的麻烦。但我们所想要实现的功能是,当用户点击登陆按钮,如果验证成功,跳入下一个Activity,如果验证失败,原地不动。

  使用过AlertDialog的朋友肯定都清楚一个事实,无论你如何设置按键响应,这个Dialog都会被关闭。

  如何解决这个问题呢?那么这个问题是否可以自己写一个类来继承AlertDialog,通过重写其中的一些关键函数来实现我们的功能。

  我们可以通过在Eclipse下按住Ctrl的同时点击AlertDialog来跳转到其源代码,但这个首先需要查看一下AlertDialog的源码,这个的前提是你已经下载了android的源码并且放在了sdk的正确目录下,例如*\\android-sdk-Windows\\platforms\\android-10\\sources\\,我们打开其代码,800行左右,粗略的浏览一下,发现几个重点,800行代码的类中,只定义了一个变量:

  private AlertController mAlert;

  我想这个足够引起我们的注意,AlertController类是Android的内部类,在包com.android.internal.app中,无法通过普通的方式访问。也无法在Eclipse中通过按Ctrl键跟踪进源代码,所以我们手动找一下源代码包中的AlertController.java文件

  (位于android-sdk-windows\\platforms\\android-10\\sources\\com\\android\\internal\\app)

  打开后,查找我们比较兴趣的,比如关键词Button,或者Cancel之类的字眼,在该文件的开头,我们看到定义了一个按钮mButtonPositive,难道不就是开头提到的setPositiveButton?恩,现在只能说也许,我们继续ctrl+f寻找一下mButtonPositive的踪迹,

mButtonPositive

  但很快我们发现这段比较惹眼的定义,并且在最后出现DISMISS是关键。我们详细看后发现,if-else的部分其实是绑定了按钮及其触发的消息,最后注释后面的代码才是关键,无论我们按下哪个按钮,都会执行后面的这句,其实可以猜到了这就是令Dialog Dismiss的部分。

  然后我们再往下看,会发现ButtonHandler的定义,

ButtonHandler的定义

  简单分析一下,很显然可以看到,在switch中的MSG_DISMISS_DIALOG分支,((DialogInterface) msg.obj).dismiss(); 这就是对话框消失的原因

  介绍到我们找到了根本原因,那么我们还需要考虑一个问题,这个还需要重新写类来继承AlertDialog吗?是否有更简单地方法?

  我们可以只重新定义ButtonHandler类,通过JAVA反射机制来使得AlertController中调用我们自己定义的这个handler即可。(注意不通过反射机制是行不通的,因为我们看到handler定义为私有,并且没有相应的接口)

  那么下面我们在dialog显示之前,先执行下面的反射即可。

ButtonHandler类

  到这里就完成了反射。

  第二个例子与第一个例子有很多相似之处,那么我们就简单介绍下就好了。

  在我们的手机中,需要手机端实现自动建立WiFi无线热点,这样能够提供给身边的人来使用(我的目的是为了和身边的人交换大量数据,蓝牙是不行的)

  但搜遍了Android SDK 只发现了一些与WiFi连接有关的API,而且还是丝毫没有提及WiFiAP相关的内容。后来在StackOverflow上得到一个前辈的指导,解决的问题。那么下面我总结一下。首先我们打开源代码中的WifiManager.java,位于*android-sdk-windows\\platforms\\android-10\\sources\\android\\net\\wifi下。

源代码

  首先是直接搜索WifiAP,然后我们定位到一个函数setWifiApEnabled,看名字就知道使我们想要的。而在源代码中,存在一些API标记为hide,这些API是不允许在程序中调用的。隐藏Hidden API,主要是想阻止开发者使用SDK中那些未完成或不稳定的部分(接口或架构)。举个例子,Bluetooth API在API 5(Android 2.0)上才开放;在API 3 和4上都是用@hide属性隐藏了。当这些API被验证和清理后,Google的开发者会移除@hide属性,并让其在API 5官方化。很多地方在API 4 和5之间发生了变化。但是如果你的程序依赖某些隐藏的API,当其部署到新的平台上时,就有可能陷入困境。

  我们现在再回到刚才定位到的函数,我们看到已经标记为hide,既然这样,如果我们需要再次利用反射机制来调用这个函数,从而实现我们建立Wifi-AP的目的。

  思路与上面的一样,那么下面我只贴出反射部分代码:

反射部分代码反射代码

  WifiConfiguration 是网络配置类,它是用来配置我们的热点密码类型,秘密等等。但在这之前不要忘记在打开AP后更改WP状态。也就是method2。

     总结一下上文,本主要是通过介绍两个实例来介绍在Android应用开发中如何JAVA反射机制的应用,第一个和第二个实例的思路是差不多的,所以在看的时候可以重点学习实例一,详细的内容就不在这里介绍了,可以看回原文好好学习、分析、记忆。

赞(24)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程