反射的定义
反射是一种能够在程序运行时动态访问、修改某个类中任意属性(状态)和方法(行为)的机制(包括private实例和方法),java反射机制提供了以下几个功能:
-
在运行时判断任意一个对象所属的类;
-
在运行时构造任意一个类的对象;
-
在运行时判断任意一个类所具有的成员变量和方法;
-
在运行时调用任意一个对象的方法。
反射涉及到四个核心类:
-
java.lang.Class.java:类对象;
-
java.lang.reflect.Constructor.java:类的构造器对象;
-
java.lang.reflect.Method.java:类的方法对象;
-
java.lang.reflect.Field.java:类的属性对象;
反射有什么用?
-
操作因访问权限限制的属性和方法;
-
实现自定义注解;
-
动态加载第三方jar包,解决android开发中方法数不能超过65536个的问题;
-
按需加载类,节省编译和初始化APK的时间;
反射工作原理
当我们编写完一个Java项目之后,每个java文件都会被编译成一个.class文件,这些Class对象承载了这个类的所有信息,包括父类、接口、构造函数、方法、属性等,这些class文件在程序运行时会被ClassLoader加载到虚拟机中。当一个类被加载以后,Java虚拟机就会在内存中自动产生一个Class对象。我们通过new的形式创建对象实际上就是通过这些Class来创建,只是这个过程对于我们是不透明的而已。
反射的工作原理就是借助Class.java、Constructor.java、Method.java、Field.java这四个类在程序运行时动态访问和修改任何类的行为和状态。
反射实例
分别演示三种获取类信息的方式、获取当前类的所有方法和获取当前类及其父类的所有方法、获取当前类的所有实例和获取当前类及其父类的所有实例、获取父类信息、获取接口信息、比较反射方法和实例的性能差异等几个方面:
https://zhuanlan.zhihu.com/p/21423208