反射
反射应该是框架的灵魂,通过对反射的理解,能够更好的入手框架。
java中的对象有两种类型,编译时类型和运行时类型。
- 编译时类型是编写代码时所声明的类型
- 运行时类型指为对象赋值时所采用的类型
- 编译时类型是编写代码时所声明的类型
- 运行时类型指为对象赋值时所采用的类型
Student stu = new Person();
stu在编译时为Student类型 在运行时为Person类型
当程序还没运行时,没发获取这个类的方法和属性, 只有在运行时才能获取。
什么是反射
当程序还没运行时,没发获取这个类的方法和属性, 只有在运行时才能获取。
什么是反射
动态获取信息及动态调用的对象的方法就是java的反射机制。
-
动态获取信息即在运行状态下,对于任意一个类,都能获取到他的所有信息(成员变量,构造方法,方法,包等)
-
动态调用对象,,对于任意一个类,都能够调用到他的所有方法和属性(同上)
当程序要使用一个类的时候,首先要获得他的字节码文件即.class文件,通过类加载器将字节码文件加载到 JVM 内存中,生成一个class对象(一个类只会生成一个class对象)这个class对象包含这个类所有的方法和属性。
-
反射的步骤 :(1)获取class对象 (2)调用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(); } }
相关的拓展可以类加载器的内容 对反射机制理解有帮助作用
参考文章:(32条消息) java基础之—类加载器_sinat_38259539的博客-CSDN博客
什么是反射
动态获取信息及动态调用的对象的方法就是java的反射机制。
-
动态获取信息即在运行状态下,对于任意一个类,都能获取到他的所有信息(成员变量,构造方法,方法,包等)
-
动态调用对象,,对于任意一个类,都能够调用到他的所有方法和属性(同上)
当程序要使用一个类的时候,首先要获得他的字节码文件即.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(); } }
相关的拓展可以类加载器的内容 对反射机制理解有帮助作用