反射是框架的灵魂,通过对反射的理解,能够更好的入手框架。
为什么这样说呢,因为在学习spring的注入和动态代理的时候都是运用反射来实现的,后面会详细讲。
java中的对象有两种类型,编译时类型和运行时类型。
- 编译时类型是编写代码时所声明的类型
- 运行时类型指为对象赋值时所采用的类型
Student stu = new Person();
stu在编译时为Student类型 在运行时为Person类型
当程序还没运行时,没发获取这个类的方法和属性, 只有在运行时才能获取。
什么是反射
动态获取信息及动态调用的对象的方法就是java的反射机制。
-
动态获取信息即在运行状态下,对于任意一个类,都能获取到他的所有信息(成员变量,构造方法,方法,包等)
-
动态调用对象,,对于任意一个类,都能够调用到他的所有方法和属性(同上)
-
反射的步骤 :(1)获取class对象 (2)调用Class对象锁对应的类中定义的方法
当程序要使用一个类的时候,首先要获得他的字节码文件即.class文件,通过类加载器将字节码文件加载到 JVM 内存中,生成一个class对象(一个类只会生成一个class对象)这个class对象包含这个类所有的方法和属性。
获取反射对象
forName()
最为常用
//以Student类为例 student 类有name属性和方法
package high.School;
public class School{
public static void main(String[] args) {
Student student = new Student();
//获取student类对象
Class stu = Class.forName(high.School.Student);//全路径 包名.类名 写全路径相当于绝对路径不容易出错
//进一步获取其属性
stu.getName();
}
}
.class()
获取其class属性
//以Student类为例 student 类有name属性和方法
package high.School;
public class School{
public static void main(String[] args) {
Student student = new Student();
//获取student类对象
Class stu = Student.class;
//进一步获取其属性
stu.getName();
}
}
getClass()
返回一个对象的运行时类
//以Student类为例 student 类有name属性和方法
package high.School;
public class School{
public static void main(String[] args) {
Student student = new Student();
//getClass()获取student类对象
Class stu =student.getClass();
//进一步获取其属性
stu.getName();
}
}
相关的拓展:
学习类加载器的内容 对反射机制理解有帮助作用
参考博文:https://blog.youkuaiyun.com/sinat_38259539/article/details/71794617?spm=1001.2014.3001.5502)