Java类加载机制和反射机制

开发工具与关键技术: Java
作者:杜永鹏
撰写时间:2021 年 7 月 16日
1、 Java类加载机制
jvm把class文件加载到内存,并对数据进行校验、解析和初始化,最终形成jvm可以直接使用的java类型的过程。
1.1、 加载:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的访问入口。
1.2、 链接:将java类的二进制代码合并到jvm的运行状态之中的过程,链接过程又分为3个过程:
2.1. 验证:确保加载的类信息符合jvm规范,没有安全方面的问题。
2.2. 准备:正式为类变量(static变量)分配内存并设置类变量初始值的阶段,这些内存都将在方法区中进行分配。
2.3. 解析:虚拟机常量池内的符号引用替换为直接引用的过程。(比如String s =“aaa”,转化为 s的地址指向“aaa”的地址)
1.3、初始化:初始化阶段是执行类构造器方法的过程。类构造器方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static块)中的语句合并产生的。
当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先初始化其父类的初始化
虚拟机会保证一个类的构造器方法在多线程环境中被正确加锁和同步
当访问一个java类的静态域时,只有真正声明这个静态变量的类才会被初始化。
2、ClassLoader类加载器
ClassLoader类加载器的作用就是将 .class 文件加载到JVM虚拟机中去
public static void main(String[] args) throws ClassNotFoundException {
//获取类加载器
ClassLoader classLoader= ClassLoaderDemo.class.getClassLoader();
System.out.println(classLoader);
//常用三种方式加载类
//使用ClassLoader.loaderClass()来加载类,不会执行初始化块
System.out.println("–ClassLoader.loaderClass()—");
classLoader.loadClass(“com.dyp.reflect.Test1”);
//使用Class.forName(className)来加载类,默认会执行初始化块
System.out.println("–Class.forName(className–)");
Class.forName(“com.dyp.reflect.Test2”);//******!!!
//使用Class.forName(className,initialize,ClassLoader)来加载类,并指定ClassLoader,初始化时不执行静态块
//参数:类名,是否初始化,类加载器
System.out.println("–Class.forName(className,initialize,ClassLoader)–");
Class.forName(“com.dyp.reflect.Test3”,true,classLoader);
}
}

class Test1 {
static {
System.out.println(“Test1 静态初始化块”);
}
}
class Test2 {
static {
System.out.println(“Test12 静态初始化块”);
}
}
class Test3 {
static {
System.out.println(“Test3 静态初始化块”);
}
3、 Java反射机制
在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功能就称为java语言的反射机制。通俗点讲,通过反射,该类对我们来说是完全透明的,想要获取任何东西都可以。
Class类常用类:
1、返回值类型:Class 方法(形参)forName(String className)说明: 返回与带有给定字符串名的类或接口相关联的 Class 对象。
2、返回值类型:Class 方法(形参)forName(String name, boolean initialize, ClassLoader loader)说明:使用给定的类加载器,返回与带有给定字符串名的类或接口相关联的 Class 对象。
3、返回值类型:ClassLoader 方法(形参)getClassLoader() 说明:返回该类的类加载器。
4、返回值类型:Constructor 方法(形参)getConstructor(Class… parameterTypes) 说明:返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。
5、返回值类型:Constructor[] 方法(形参)getConstructors() 说明:返回一个包含某些Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。
6、返回值类型:Constructor 方法(形参)getDeclaredConstructor(Class… parameterTypes)说明:返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。
7、返回值类型:Constructor[] 方法(形参)getDeclaredConstructors()返回 Constructor 说明:对象的一个数组,这些对象反映此 Class对象表示的类声明的所有构造方法。
8、返回值类型:Field 方法(形参)getDeclaredField(String name)说明:返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
9、返回值类型:Field[] 方法(形参)getDeclaredFields()说明:返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
10、返回值类型:Method 方法(形参)getDeclaredMethod(Stringname, Class… parameterTypes)说明:返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。
11、返回值类型:Method[] 方法(形参)getDeclaredMethods()说明:返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
12、返回值类型:Field 方法(形参)getField(String name)说明:返回一个 Field 对象,它反映此Class 对象所表示的类或接口的指定公共成员字段。
13、返回值类型:Field[] 方法(形参)getFields()说明:返回一个包含某些 Field 对象的数组,这些对象反映此 Class对象所表示的类或接口的所有可访问公共字段。
14、返回值类型:Method 方法(形参)getMethod(String name,Class… parameterTypes)说明:返回一个 Method 对象,它反映此 Class 对象所表示的类或
接口的指定公共成员方法。
15、返回值类型:Method[] 方法(形参)getMethods()说明:返回一个包含某些 Method 对象的数组,这些对象反映此Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共member 方法。
通过反射机制往List中添加任意类型的元素
注意:这只是演示反射机制,在正常的开发中不能这样使用
/**

  • 通过反射机制往List中添加任意类型的元素
  • 这只是演示反射机制,在正常的开发中不能这样使用

*/
public class ReflectDemo3 {
public static void main(String[] args) {
List list= new ArrayList();
//list.add(“111”);
list.add(11);

	try {
		//获取类
		Class<?> class1=list.getClass();
		//获取方法
		Method addMethod=class1.getMethod("add", Object.class);
		//执行,添加任意类型对象
		addMethod.invoke(list, "asfdgh");
		addMethod.invoke(list, true);
		addMethod.invoke(list, new Date());
		
		System.out.println(list);
	} catch (Exception e) {
		// TODO: handle exception
	}
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值