Java类加载机制和反射机制
开发工具与关键技术:Java
作者:吴永旗
撰写时间:2019年4月26日
-
什么是java类加载机制?
JVM把class文件加载到内存中,并对数据进行验证,解释和初始化,最终形成JVM可以直接使用的Java类型过程。 -
获取类加载器,关键字ClassLoader,通过“类名+class+getClassLoader”获取类加载,
类的加载有三种方法
方法一: (ClassLoader loader).loadClass(String name)
方法二:Class.forName(String name)
方法三:Class.forName(String name,Bollean initialize, ClassLoader loader)
package com.gx.demo2;
public class Personson {
public static void main(String[] args) {
//获取类加载器
ClassLoader load=Personson.class.getClassLoader();
//类的加载有三种方法
//com.gx.demo2包名,Demod类名
load.loadClass(“com.gx.demo2.Demod”);方法一,不会初始化块 Class.forName(“com.gx.demo2.Demod”);方法二,默认初始化块
Class.forName(“com.gx.demo2.Demod”, true, load);参数:类名,是否初始化块,加载类
}
}
class Demod{//需要加载的类
static{
System.out.println(“ClassLoader类加载器”);
}
} -
什么是Java反射机制?
简单的理解为对于任意一个类,我们到可以通过反射机制获取该类的所有属性和方法,对于一个对象,都可以调用其所有方法和属性(包括私有的)。
Class类常用类方法有: -
forName(String className) 返回给定字符串名的类或和接口相关class对象的
-
getClassLoader()返回该类的类加载器
-
getConstructors()返回 Constructor对象的数组,代表类声明的所有公共构造方法
-
getDeclaredConstructors()返回 Constructor对象的数组,代表类声明的所有私有公共构造方法
-
getFields()返回该类对象所声明的所有的字段
-
getDeclaredFields()返回该类对象所声明的所有私有的字段
-
getMethods()返回该类对象的所有方法
-
getDeclaredMethods()返回该类对象的所有私有方法
-
SetAccessible(true) 用于打破封装,设置访问
-
例如:反射一个Dome类
思路:首先要通过反射机制获取Dome类的加载器,获取加载类方法(包名+类名),然后通过反射机制获取所有构造器,方法名和成员变量,最后通过反射机制调用构造器实例化一个类的对象,调用普通方法和设置成员变量等;
-
反射所有构造器
显示反射机制获取所有构造器如下首先获取类加载器和加载方法,通过getDeclaredCoustructors()方法获取所有构造器存放于定义的Constructor<?>[]数组中,通过for循环遍历所有构造,然后按照“修饰符+名称+构造器形参列表类型”通过字符串拼接而成,结果如下所示2.反射所有方法
显示反射机制获取所有方法,通过getDeclaredMethod()方法获取所有方法存放于定义的Method[]数组中,通过for循环遍历所有方法,然后按照“修饰符+返回值+名称+方法形参列表类型”通过字符串拼接而成,结果如下所示3.反射所有成员变量
显示反射机制获取所有成员变量,通过getDeclaredField()方法获取所有成员变量
存放于定义的Field[]数组中,通过for循环遍历所有成员变量,然后按照“修饰符+返回值+名称”通过字符串拼接而成,结果如下所示
4.通过发射机制调用构造器实例一个对象和调用一个普通的方法
显示如下: