1、反射是什么
在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能称为JAVA语言的反射机制
2、获得一个类的类对象的方式
(1)类名.class
(2)对象.getClass()
(3)Class.forName(包名.类名)
//第一种方式:类名.class
Class stuClass1 = Student.class;
//第二种方式:对象.getClass()
Student stu = new Student();
Class stuClass2 = stu.getClass();
//第三种方式:Class.forName(包名.类名)
Class stuClass3 = Class.forName("com.xiaoxue.demo.Student");
3、通过反射创建对象
(1)类对象调用newInstance()方法
(2)通过类对象的getConstructor()或getDeclaredConstructor()方法获得构造器对象并调用newInstance()方法创建对象
//第一种方式:类对象调用newInstance()方法
Class stuClass = Class.forName("com.xiaoxue.demo.Student");
Object obj = stuClass.newInstance();
//第二种方式:
Class stuClass = Class.forName("com.xiaoxue.demo.Student");
Object obj = stuClass.getConstructor().newInstance();
等价于 Student stu = new Student();
4、通过反射设置对象私有字段的值
通过类对象的getDeclareField()方法字段对象,类对象调用方法setAccessible(true)(表示屏蔽java语言的权限访问检查),再通过set()方法设置字段的值set(Object obj, Object newValue)
Object obj = stuClass.getConstructor().newInstance();
Field f = stuClass.getDeclaredField("phoneNum");
f.setAccessible(true);
f.set(obj, "123456");
5、通过反射调用对象的方法
调用invoke()方法
Method m = stuClass.getMethod("print");
m.invoke()
package com.xiaoxue.demo;
public class Student {
public Student() {
}
public String name;
protected int age;
char sex;
private String phoneNum;
@Override
public String toString() {
return "Student[name=" + name + ", age=" + age + ", sex =" + sex + ", phoneNum =" + phoneNum + "]";
}
public void print(){
System.out.println("hello reflact");
}
}
package com.xiaoxue.demo;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
public class ReflectTest {
public static void main(String[] args) throws NoSuchMethodException, SecurityException, ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException {
Class stuClass = Class.forName("com.xiaoxue.demo.Student");
System.out.println("获取所有公有的字段");
Field[] fieldArray = stuClass.getFields();
for(Field f : fieldArray) {
System.out.println(f);
}
System.out.println("获取所有的字段(包括私有、受保护、默认)");
fieldArray = stuClass.getDeclaredFields();
for(Field f : fieldArray) {
System.out.println(f);
}
Object obj = stuClass.getConstructor().newInstance();
Student stu = (Student)obj;
System.out.println("获取私有字段并调用");
Field f = stuClass.getDeclaredField("phoneNum");
System.out.println(f);
f.setAccessible(true);
f.set(obj, "123456");
System.out.println("验证电话:" + stu);
Method m = stuClass.getMethod("print");
System.out.println(m.invoke(m));
}
}