JAVA 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 java 语言的反射机制。
实际上,我们创建的每一个类也都是对象,即类本身是 java.lang.Class 类的实例对象。这个实例对象称之为类对象,也就是 Class 对象。
一、概述
反射就是把 java 类中的各种成分映射成一个个的 Java 对象
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。
(其实:一个类中这些成员方法、构造方法、在加入类中都有一个类来描述)
如图是类的正常加载过程:反射的原理在与 class 对象。
熟悉一下加载的时候:Class 对象的由来是将 class 文件读入内存,并为之创建一个 Class 对象。
- Class 类的实例表示正在运行的 Java 应用程序中的类和接口。也就是 jvm 中有 N 多的实例每个类都有该 Class 对象。(包括基本数据类型)
- Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。也就是这不需要我们自己去处理创建,JVM 已经帮我们创建好了。
二、获取class对象的三种方式
- 通过object类的 getClass() 函数,由于object是根类,每一个类都有这个函数
- 每一个类(包括基本数据类型,注意这里基本数据类型不用转成包装类)都有一个class属性,静态属性,通过类名直接访问
- 通过Class类的静态方法 forName(String className)
package test.reflect;
/**
* @author 谢世杰
*/
public class GetClass {
public static void main(String[] args) {
Student student = new Student();
// 第一种方式
Class stuClass1 = student.getClass();
System.out.println(stuClass1.getName());
// 第二种方式
Class stuClass2 = Student.class;
System.out.println(int.class.getName());
System.out.println(stuClass1 == stuClass2);
// 第三种方式
try {
Class stuClass3 = Class.forName("test.reflect.Student");
System.out.println(stuClass1 == stuClass3);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
运行结果:
test.reflect.Student
int
true
true
可以看到所有获得到的class对象都是同一个。
三、通过反射获取构造函数并使用
- student类
package test.reflect;
/**
* @author 谢世杰
*/
public class Student {
public String id;
private String name;
private String sex;
private int age;
public Student() {
System.out.println("公有,无参构造函数");
}
public Student(String name) {
System.out.println("name:" + name);
}
private Student(int age) {
System.out.println("私有构造函数" + age);
}
public void test(String name, int age) {
System.out.println("name:"+name+" age:"+age);
}
public void setName(String name) {
this.name = name;
}
public void setSex(String sex) {
this.sex = sex;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public String getSex() {
return sex;
}
public int getAge() {
return age;
}
}
- 测试类