反射的概念
反射:Java的反射(reflflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,既然能拿到那么,我们就可以修改部分类型信息;这种动态获取信 息以及动态调用对象方法的功能称为java语言的反射(reflflection)机制。
- 在JVM运行的时候,对于JVM任何一个类,都能动态的获取该类的所有属性和方法
- 对于JVM中任何一个对象,都能动态的调用对象的属性和方法
- 一切框架的基础
运行时类型和编译时类型
Person p =new Student();//p的编译时类型是Person,运行时类型是Student;
反射相关的类
- 都在java.lang.reflect包中
相关方法
Class类
- 使用class关键字,包括类,数组,包括接口编译后生成的class文件就对应一个唯一的class对象,由JVM产生,使用这个Class对象可以获取该类的所有信息
- 比如 javac Student.java->Student.class,将JVM启动后,Student这个类被加载到JVM之后成为一个全局唯一的Students.class对象,由JVM产生,就根据这个对象来反射操作Student类
- 无论你想通过反射完成什么操作,首先都要获得获取类的class对象(由JVM产生,全局唯一)
- 有三种获得class对象的方法 1调用Class.forName(包名.类名) 2调用类的名称.class对象 3通过类的任意对象的getClass方法()
Student类
package reflect_test; public class Student extends Person{ public String name; private int age; public void test(){ System.out.println("这是public属性的test方法"); } private void test1(){ System.out.println("这是private属性的test1方法"); } public Student() { System.out.println("public权限的无参构造"); } public Student(String name) { this.name = name; System.out.println("public权限的name构造函数"); } private Student(String name, int age) { this.name = name; this.age = age; System.out.println("private权限的name构造函数"); } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
Constructor类
- 反射调用类中的构造方法
通过反射创建实例化对象
Method类
- 反射调用类中的成员/类方法
通过反射调用方法的方法
Filed类
- 反射调用类中的成员/类属性
通过反射获取或者调用属性