JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法(哪怕是private限定);对于任意一个对象,都能够调用它的任意一个方法和属性“(即使有些属性没有提供Set Get方法);这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法,所以先要获取到每一个字节码文件对应的Class类型的对象
获取类的字节码(class)文件对象的三种方式
一:Object类的getClass()方法
二:静态属性class
三:Class类中静态方法forName() ----常用
public static Class forName(String className); //className: 这个表示的是一个类对应的全类名(就是需要加上包名)
通过反射获取无参构造方法
A:获取所有构造方法
public Constructor<?>[] getConstructors() 获取所有的构造方法不包含私有的
public Constructor<?>[] getDeclaredConstructors() 获取所有的构造方法 包括私有的
B:获取单个构造方法
public Constructor<T> getConstructor(Class<?>... parameterTypes) 获取单个的构造方法 不包含私有的
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 获取单个的构造方法包含私有的
C:案例演示: 通过反射获取无参构造方法并使用
A:案例演示: 通过反射获取私有构造方法并使用
// 获取字节码文件对象
Class clazz = Class.forName("com.click369.Student") ;
Constructor con = clazz.getDeclaredConstructor(String.class , int.class) ;
// 值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。
con.setAccessible(true) ; 取消语法检查不然会报错 因为私有的外界不能直接访问
Object obj = con.newInstance("张三" , 23) ;
System.out.println(obj);
案例演示:通过反射获取所有成员变量
A:获取所有成员变量
public Field[] getFields() 获取所有的成员变量包含从父类继承过来的
public Field[] getDeclaredFields() 获取所有的成员变量 包含私有的 也包含从父类继承过来的成员变量
B:获取单个成员变量
public Field getField(String name)
public Field getDeclaredField(String name)
C:案例演示: 通过反射获取成员变量并使用
package org.westos.demo;
public class Student {
//定义成员变量
public String name;
private int age;
public char sex;
private Student() {
}
}
-----------------------------------------------------------------------------------------
package org.westos.demo;
import java.lang.reflect.Field;
publ