一、什么是反射

反射,即Reflection,通常是指程序可以访问、检测和修改它本身状态或行为的一种能力。

具体说来,是在运行状态时,对于任意一个类或对象,能够知道和操作它的任意方法和属性。

需要注意的是,反射是一种非常规手段,反射有风险,应用需谨慎。

二、为什么要用反射

为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念:

  • 静态编译:在编译时确定类型,绑定对象,即通过。
  • 动态编译:运行时确定类型,绑定对象。

反射的初衷不是方便你去创建一个对象,而是让你在写代码的时候可以更加灵活,降低耦合,提高代码的自适应能力.

利用反射机制,我们可以动态调用一些protected甚至是private的方法或类,这样可以满足我们一些场景下的特殊需求。

三、Reflection API 几个重要类

  • Class:类
  • Field:类的成员变量
  • Method:类的方法
  • Constructor:类的构造方法

四、如何使用反射

1、获取Class对象

方法一:类名.class

Class<?> cls = Student.Class();
Student student =(Student)cls.newInstance();

方法二:Class.forName(类路径)

Class<?> class = Class.forName("com.kwmax.Student"); //forName(包名.类名)
Student student = (Student)class.newInstance();

方法三:对象.getClass()

Student stu1 = new Student();
Class<?> cls = student.getClass();
student stu2 = (Student)cls.newInstance();

三种方法的区别:

方法一不执行静态块和动态构造块,

方法二执行静态块、不执行动态构造块,

方法三需要创建对象,静态块和动态构造块均会执行

2、获取类属性

//下面两种可以获取到public属性
mClass.getField(属性名);
mClass.getFields();//返回指定名的属性,不论公共还是私有
mClass.getDeclaredField(属性名);
//返回所有属性,不论公共还是私有
mClass.getDeclaredFields();

3、获取类方法

//下面两种可以获取到public方法
mClass.getMethod(方法的名称);
mClass.getMethods();//返回指定名的方法,不论公共还是私有
mClass.getDeclaredMethod(方法的名称);
//返回所有属性,不论公共还是私有
mClass.getDeclaredMethods();

4、获取构造方法

//下面两种可以获取到public方法
mClass.getConstructor(可变参数集合);
mClass.getConstructors();//返回指定名的构造方法,不论公共还是私有
mClass.getDeclaredConstructor(参数类名);//返回所有构造方法,不论公共还是私有
mClass.getDeclaredConstructors();

5、实例化对象

除了第一种方法,获取类对象后实例化,还可以通过构造方法实例化

 constructor.newInstance(可变参数);

6、一些可能用到的操作方法:

//获取到反射的权限,如果为私有的则需要设置为true
constructor.setAccessible(true);
method.setAccessible(true)//设置属性值
field.set(Objkect obj,Object value);//获取属性对象
field.get(Object)
例子:Person p = (Persion)filed.get(对象);//获取这个类的父类
getSuperclass()//获取这个类实现的所有接口
getInterfaces()//获取方法的返回类型
getReturnType()

Android 反射相关推荐

  1. Android 反射 换一种方式编程

    Android 反射-换一种方式编程 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/59109933 本文出自[赵彦军的博客] 上一 ...

  2. Android : 反射机制获取或设置系统属性(SystemProperties)

    Android.os.SystemProperties 提供了获取和设置系统属性的方法,但是这个类被隐藏了,应用开发时无法直接访问,可以通过反射的机制进行操作. 获取系统属性 public stati ...

  3. Android 反射、代理调用系统隐藏API方法与接口类连接Wi-Fi

    本文转载自:http://www.xwdoor.net/android-reflection-proxy-call-system-hidden-api-method-and-interface-cla ...

  4. Android 反射获取内外置存储卡方法

    2019独角兽企业重金招聘Python工程师标准>>> 以前的Android(4.1之前的版本)中,SDcard跟路径通过"/sdcard"或者"/mn ...

  5. android反射开启通知_Android中反射的简单应用

    自己对反射的理解和应用还处于比较浅显的阶段,写这篇文章更多在于整理总结,也就是帮助自己进一步的理解和学习反射机制. 反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修 ...

  6. Android反射修改view,Android 修改viewpage滑动速度的实现代码

    1.自定义Scroller public class ViewPageFixedSpeedScroller extends Scroller { private int mDuration = 300 ...

  7. Android反射set/get系统属性(SystemProperties)

    以Android系统版本号和SDK版本号为例 # setprop ro.build.version.sdk 23 # setprop ro.build.version.release 5.1.1 fr ...

  8. android 反射机制

    Android系统内部提供了一个不错的txt文本读写类,但目前并没有公开提供给标准的SDK,FileUtils类的源代码如下,可以很好的操作Linux下的文本文件. public class File ...

  9. android反射调用护眼模式

    android 11反射调用护眼模式/夜间模式 Android 10 推出了 COLOR_DISPLAY_SERVICE 系统服务,具备系统 API 接口,使系统."设置"和系统界 ...

  10. android反射替换字体,快速使用反射更换Android全局字体

    问题背景 之前在编写鲤鱼日语时,因为使用了外部的字体,这导致了一个问题就是我的ListView显示的是圆滑的字体,但是其他dialog.Spinner就全都是Android默认字体,这样不统一就会很难 ...

最新文章

  1. java中子类对父类中的私有变量和私有方法有拥有权无使用权
  2. Bootstrap CustomBox 弹层
  3. i 智慧 | 深度广度并举,AWS容器服务再推利器!
  4. oracle sql last_value,図でイメージするOracle DatabaseのSQL全集 第3回 分析関数
  5. 常用的几个提高iOS开发效率的开源类库及工具
  6. 以太坊核心开发者正在制定ETH2.0合并最低技术规范
  7. 小程序 实名信息_微信小程序+商城信息管理系统
  8. 常用集合(ArrayList、Hashset、HashMap)的用法(会一直更新)
  9. 启动 Tomcat 日志乱码问题
  10. PTA离散数学集合论自测(有答案)
  11. 笔记本单/双网卡如何同时上内外网
  12. 高一计算机网络技术应用计划,高一信息技术第一学期教学计划
  13. poi导出excel文件乱码
  14. 德州市德城区农产品区域公用品牌“尚德诚品”正式发布
  15. 服务器文件夹怎么用快捷方式打开,文件夹变成快捷方式怎么办 文件夹变成快捷方式解决方法...
  16. java reflection 作用,全方位解读Java反射(reflection)
  17. 服务器重启后启动php项目
  18. 缩放图像、切割图像、图像类型转换、彩色转黑白、文字水印、图片水印
  19. 【实验2 选择结构】7-9 sdut-C语言实验-三位数整数的各位数字
  20. 聊聊并发编程的12种业务场景

热门文章

  1. Linux多线程编程-互斥锁
  2. “美国饿了么”DoorDash完成6亿美元融资 估值升至126亿美元
  3. 计算机专业考研也上岸分,考研分数或将“上涨”的专业,想要成功上岸,最少达到380分...
  4. Caffe: 为什么你的tf模型转caffemodel老不对?(其中一个重要原因)
  5. Mac iTerm2 rz sz
  6. mysql创建索引的关键字为_MySQL创建索引(CREATE INDEX)
  7. 通过weui-1.1.3源码学习前端开发(三)从example看起-src/index.html文件
  8. 基于MATLAB搭建的两端LCC- HVD C输电模型,两端交流电网为345KV
  9. coreseek中文搜索引擎简述及使用
  10. android 字体失真,Android 图片及文字模糊效果