加载器是java运行时环境的一部分,负责加载字节码文件,即将磁盘上的某个class文件读取到内存并生成Class的对象
用于加载系统类库**
用于加载扩展类库**
用于加载我们自定义的加载器
来自Class类型获取类加载器的方式
public ClassLoader getClassLoader()//返回类的加载器
示例:
public class TestDemo1 {
@Test
public void testClassLoader(){
//获取TestDemo1的Class对象
Class<TestDemo1> demo = TestDemo1.class;
//获取AppClassLoader类加载器对象
ClassLoader cl1 = demo.getClassLoader();
System.out.println(cl1);
//获取AppClassLoader类加载器的父类扩展类加载器ExtClassLoader
ClassLoader cl2 = cl1.getParent();
System.out.println(cl2);
//获取ExtClassLoader类加载器的父类启动类加载器Bootstrap
ClassLoader cl3 = cl2.getParent();//null
System.out.println(cl3);
}
}
某个“类加载器”收到类加载的请求,它首先不会尝试自己取加载这个类,而是把请求交给父级类加载。
因此,所有的类加载的请求最终都会被传送到顶层的“启动类加载器”中。
如果父级类加载器无法加载这个类,然后子级类加载器再去加载。
示例步骤:
在src下新建一个user.properties文件,并输入:
userName=TG
age=21
创建properties类的集合对象p
使用当前类TestDemo2获取Class对象并调用Class类中的getClassLoader函数
使用类加载器对象调用ClassLoader类中的**InputStream getResourceAsStream(String name)**返回读取指定资源的输入流
public class TestDemo2 {
@Test
public void testGetResourceAsStream() throws IOException {
//获取类加载器对象
Class<TestDemo2> cla = TestDemo2.class;
ClassLoader classLoader = cla.getClassLoader();
//使用类加载器中的方法,获取src目录下的配置文件
InputStream is = classLoader.getResourceAsStream("user.properties");
//创建Properties对象
Properties prop = new Properties();
prop.load(is);
System.out.println(prop);
}
}
是针对Class对象进行操作,是一种类的解剖技术(.class文件中有:构造方法、成员方法、成员变量),反射就可以获取.class文件中的构造方法、成员方法和成员变量。获取到这些东西有啥用嘞?当我们获取到构造方法时,我们可以创建对象,当我们获取到成员变量时,我们可以进行取值和赋值,当我们获取到成员方法时,我们可以进行方法调用执行。上述这种在运行过程中动态的获取类的信息以及调用类中成分的能力称为java语言的反射机制
反射的第一步都是先得到编译后的Class类对象,然后就可以得到Class的全部成分。
Class cls = 类名.class
Class cls = Class.forName("com.mysql.cj.jdbc.Driver");//编写代码时不要求Driver必须存在
Class cls = 对象名.getClass();
示例:
public class TestDemo3 {
//类名.class
@Test
public void classTest() {
System.out.println