百度百科:Java的反射(reflection)机制
是指在程序的运行状态中,
可以构造任意一个类的对象,
可以了解任意一个对象所属的类,
可以了解任意一个类的成员变量和方法,
可以调用任意一个对象的属性和方法。
这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。
正题
一、在学习反射前,我们先了解下class Class这个类,它在java.lang包下,是所有反射的源头!
- java.lang.Class类
- 1、Class类是用来描述Xxxx类的
- 2、Class类的对象只能由系统构建
- 3、Class类的对象封装了Xxxx类的详细信息
class Class<T>{} (它描述类的类,它的对象只能由系统去构建,并且这个对象封装了描述类的详细信息)
class Xxxx{} (JDK内置类与我们的自定义类,都是被它描述的类)
二、类加载过程
- Class对象
- 1、Class对象与Xxxx类一 一对应关系
一个.java文件 “通过Java编译器javac编译成” .class字节码文件 “通过类加载器” 加载到内存中:此时在java内存方法区中,会产生一个对应的Class对象,就是那个由系统构建的Class对象!
三、获取某个类的Class对象
@SneakyThrows
public static void main(String[] args) {
//1. 指定类.class
Class c1 = Person.class;
//2. 指定类的实例.getClass()
Person person = new Person();
Class c2 = person.getClass();
//3. Class.forName(指定类的全限定类名)
Class c3 = Class.forName("com.baijun.utils.test.Person");
}
四、反射
@SneakyThrows
public static void main(String[] args) {
//获取Class对象
Class c1 = Person.class;
//获取完整包类名
System.out.println(c1.getName());
//获取类名
System.out.println(c1.getSimpleName());
//获取类的全部属性
Field[] fields = c1.getDeclaredFields();
for (Field field : fields) {
System.out.println(field);
}
//获取指定属性的值
Field name = c1.getDeclaredField("name");
System.out.println(name);
//获取本类及父类的全部方法
Method[] methods = c1.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method);
}
//获取指定方法
Method getMethod = c1.getMethod("getName");
System.out.println(getMethod);
//获取全部构造方法
Constructor[] constructors = c1.getDeclaredConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
//获取指定构造方法
Constructor constructor = c1.getDeclaredConstructor(String.class);
System.out.println(constructor);
}
类加载器:每个类加载器,都负责管理一片范围类的加载,可通过Class对象.getClassLoader()方法,知道是由哪个加载器负责。
1.系统加载器:sun.misc.Launcher$AppClassLoader@18b4aac2
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
2.系统加载器的父类之扩展加载器:sun.misc.Launcher$ExtClassLoader@2d98a335
ClassLoader parent = systemClassLoader.getParent();
3.扩展加载器的父类之根加载器:是由C++编写的,我们无法直接获取所以是nul
ClassLoader parentRoot = parent.getParent();