分享

关于java反射,你真的了解吗?

 然并卵书屋 2017-05-27

关于java反射,你真的了解吗?

反射的概念在 Java中是一个难点,对于刚接触的同学来说,不太容易理解,如何更好的掌握反射技术,并学会在实际中应用,需要反复练习和研究,威哥在这里建议大家,不要心急,老话说心急吃不了热豆腐,只要我们有唧唧复唧唧的精神,吃透反射的概念那是迟早的事。

什么是反射

Java 反射是可以让我们在运行时获取类的方法、属性、父类、接口等类的内部信息的机制。也就是说,反射本质上是一个“反着来”的过程。我们通过new创建一个类的实例时,实际上是由Java虚拟机根据这个类的Class对象在运行时构建出来的,而反射是通过一个类的Class对象来获取它的定义信息,从而我们可以访问到它的属性、方法,知道这个类的父类、实现了哪些接口等信息。

我们知道使用javac能够将.java文件编译为.class文件,这个.class文件包含了我们对类的原始定义信息(父类、接口、构造器、属性、方法等)。.class文件在运行时会被ClassLoader加载到Java虚拟机(JVM)中,当一个.class文件被加载后,JVM会为之生成一个Class对象,我们在程序中通过new实例化的对象实际上是在运行时根据相应的Class对象构造出来的。确切的说,这个Class对象实际上是java.lang.Class泛型类的一个实例,比如Class对象即为一个封装了MyClass类的定义信息的Class实例。由于java.lang.Class类不存在公有构造器,因此我们不能直接实例化这个类。

如何获取,class文件对象

1、使用类的对象获取

每个类都使用Object作为父类,Object类方法 getClass()

返回这个类的class文件对象,方法返回值Class类型对象

2、使用类的静态属性获取

类名.class 返回这个类的class文件对象.属性运行结果也是Class类型对象

3、使用Class类的静态方法获取

Class类静态方法 forName(String 类名) 传递字符串类名

获取到这个类的class文件对象,方法返回值也是Class类型对象

不管用哪种方式获取的Class对象,他们都是相等的。

关于java反射,你真的了解吗?

关于java反射,你真的了解吗?

获取构造

关于java反射,你真的了解吗?

获取成员变量

关于java反射,你真的了解吗?

反射在 Android中的应用

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

然而在android中Google很多的类的某些方法不让第三方应用去调用,通过java反射机制能把这些隐藏方法获取出来并调用,三方应用上我们就很方便的去用这些方法。

例如我们需要安全的杀死某个应用的服务和进程调用ActivityManager.forceStopPackage()方法很方便:

关于java反射,你真的了解吗?

当然隐藏了这些API是为了防止第三方应用打破其他应用程序,停止服务,消除他们的警报等等。隐藏的这些api肯定也是有系统权限的,这些权限也是被隐藏的,那么我们怎么在自己的应用里去调用这些权限呢?

package='com.acer.shadow.apps'

android:versionCode='1'

android:versionName='1.0'

android:sharedUserId='android.uid.system'>

='android.permission.FORCE_STOP_PACKAGES'/>

如上,我们只需要在AndroidManifest.xml中添加android:sharedUserId='android.uid.system'这句就能调用系统的一些隐藏权限,但是这样还不行,这个应用还得签名。

用命令行进入到目录下面输入

java -jar signapk.jar platform.x509.pem platform.pk8 ResApp.apk DesApp.apk

ResApp.apk:要签名的apk DesApp.apk签名后生成的apk。

Android班已确定提前开班,想学的同学请抓紧报名,过时不候哦。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多