一、什么是类加载器
类加载器
类加载器:负责将.class文件(存储的物理文件)加载在到内存中
类加载的过程
类加载时机
类在什么时候会被加载到内存中呢?
类加载时机
- 创建类的实例(对象)
- 调用类的类方法
- 访问类或者接口的类变量,或者为该类变量赋值
- 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
- 初始化某个类的子类 直接使用java.exe命令来运行某个主类
用到就加载,不用不加载
类加载的过程
类加载的过程的小结
当一个类被使用的时候,才会加载到内存
类加载的过程如下:
加载、验证、准备、解析、初始化
类加载的过程
加载
验证
准备
解析
解析
初始化
类加载器的分类
类加载器的分类
启动类加载器(Bootstrap ClassLoader):虚拟机内置的类加载器。
平台类加载器(Platform Classloader):负责加载JDK中一些特殊的模块。
系统类加载器(System Classloader):负责加载用户类路径上所指定的类库。
package com.myclassloader;
/**
* 获取类加载器
*/
public class ClassLoaderDemo1 {
public static void main(String[] args) {
//获取系统类加载器
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
//获取系统类加载器的父加载器 --- 平台类加载器
ClassLoader classLoader1 = systemClassLoader.getParent();
//获取平台类加载器的父加载器 --- 启动类加载器
ClassLoader classLoader2 = classLoader1.getParent();
System.out.println("系统类加载器" + systemClassLoader);
System.out.println("平台类加载器" + classLoader1);
System.out.println("启动类加载器" + classLoader2);
}
}
package com.day015_Teacher.demo02_ClassLoader;
public class MyLoader {
public static void main(String[] args) {
ClassLoader s = ClassLoader.getSystemClassLoader();
System.out.println(s);
// 使用任意一个java类的对象的字节码文件对象,也可以获取它的类加载器
ClassLoader s2 = MyLoader.class.getClassLoader();
System.out.println(s2);
}
}
jdk.internal.loader.ClassLoaders$AppClassLoader@3fee733d
jdk.internal.loader.ClassLoaders$AppClassLoader@3fee733d
Process finished with exit code 0
所以:两种方式都是一样的
类加载器
方法名 | 说明 |
public static ClassLoader getSystemClassLoader() | 获取系统类加载器 |
public InputStream getResourceAsStream(String name) | 加载某一个资源文件 |
package com.myclassloader;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class ClassLoaderDemo2 {
public static void main(String[] args) throws IOException {
//static ClassLoader getSystemClassLoader() 获取系统类加载器
//InputStream getResourceAsStream(String name) 加载某一个资源文件
//获取系统类加载器
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
//利用加载器去加载一个指定的文件
//参数:文件的路径
//返回值:字节流。
InputStream is = systemClassLoader.getResourceAsStream("prop.properties");
Properties prop = new Properties();
prop.load(is);
System.out.println(prop);
is.close();
}
}
{name=zhangsan, age=13}
Process finished with exit code 0
package com.day015_Teacher.demo02_ClassLoader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;
public class ClassLoaderDemo2 {
public static void main(String[] args) throws IOException {
//static ClassLoader getSystemClassLoader() 获取系统类加载器
//InputStream getResourceAsStream(String name) 加载某一个资源文件
//用getClassLoader方法了,就是先获取系统类加载器,然后再利用类加载器读1.txt文件,生成一个字节输入流对象
// 而系统类加载器默认读文件的路径是从src开始读的,所以能读到;
//InputStream is = ClassLoaderDemo2.class.getClassLoader() .getResourceAsStream("1.txt");
// 不用getClassLoader方法,就是直接利用当前类的字节码文件对象读1.txt文件,生成一个字节输入流对象
// 而当前文件的字节码文件对象默认读文件的路径是从当前文件的包下开始读的,所以读不到;就得到了null
InputStream is = ClassLoaderDemo2.class.getResourceAsStream("1.txt");
// System.out.println(is);
//利用加载器去加载一个指定的文件
//参数:文件的路径
//返回值:字节流。
//ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
//InputStream is = systemClassLoader.getResourceAsStream("1.txt");
InputStreamReader isr = new InputStreamReader(is,"utf-8");
Properties prop = new Properties();
prop.load(isr);
System.out.println(prop);
is.close();
}
}
二、反射
反射的概述
反射概述
Java反射机制
是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意属性和方法;
这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。
反射概述
程序员
Java反射机制
是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意方法和属性;
这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。
Java反射机制
利用反射可以无视修饰符获取类里面所有的属性和方法。
先获取配置文件中的信息,动态获取信息并创建对象和调用方法