类加载器的作用:
java中源文件通过java编译器产生了字节码文件,而类加载器及时负责将字节码文件加载到内存中。并将这些静态数据转化成方法区中运行时数据结构。然后再堆中生成一个代表个类的class对象,即java.lang.class类对象。
类缓存:
标准的javaSE类加载器加载可以按照要求查找类,一旦某一个类被加载到类加载器中时,这个class对象会维持加载一段时间。然后由JVM中的垃圾回收机制回收。
引导类类加载器分类:引导类加载器、扩展类加载器、系统类加载器
示例代码:
public class test02 {
public static void main(String[] args) throws ClassNotFoundException {
//获取系统类加载器
ClassLoader c=ClassLoader.getSystemClassLoader();
System.out.println(c);
//获取系统类加载器父类--扩展类加载器
ClassLoader parent = c.getParent();
System.out.println(parent);
//获取根类加载器
ClassLoader parent1 = parent.getParent();
System.out.println(parent1);
//测试当前类是由哪个类加载器加载
ClassLoader t = Class.forName("test02").getClassLoader();
System.out.println(t);
}
}
运行结果:
双亲委派机制
除了根类加载器之外,其他类都要有自己的父类加载器,从JDK1.2开始,类加载过程采用双亲委派机制,这种机制很好的保护了java程序的安全。
classloader和URLclassloader
Classloader
是所以类加载器都需继承的父类,除根类加载器,它是一个抽象类,其中有许多方法。ClassLoader类使用委托模式来搜索类和资源。 ClassLoader的每个实例都有一个关联的父类加载器。 当请求查找类或资源时, ClassLoader实例将在尝试查找类或资源本身之前将类或资源的搜索委托给其父类加载器。 虚拟机的内置类加载器(称为“引导类加载器”)本身不具有父级,但可以作为ClassLoader实例的父级。
方法:
1、loadclass:
- public 类<?> loadClass(String name) throws ClassNotFoundException
- 加载指定的课程binary name 。 该方法以与
loadClass(String, boolean)
方法相同的方式搜索类。 它由Java虚拟机调用来解析类引用。 调用此方法相当于调用loadClass(name, false)
。
2、findclass:
- protected 类<?> findClass(String name) throws ClassNotFoundException
- 查找具有指定的课程binary name 。 该方法应该被加载类的委托模型后面的类加载器实现覆盖,并且在检查所请求的类的父类加载器之后将被
loadClass
方法调用。 默认实现会抛出一个ClassNotFoundException 。
3、defineclass:
- protected final 类<?> defineClass(String name, byte[] b, int off, int len) throws ClassFormatError
- 将字节数组转换为类别类的实例。 在类可以使用之前必须解决。
- 此方法将默认的
ProtectionDomain
分配给新定义的类。 该ProtectionDomain有效授予时相同的权限集返回Policy.getPolicy().getPermissions(new CodeSource(null, null))
被调用。 默认域是在首次调用defineClass
时创建的,并在以后的调用中重新使用。
4、resolveclass:
- protected final void resolveClass(类<?> c)
- 链接指定的类。 这个(误导性的)方法可能被类加载器用来链接一个类。 如果c类已经被链接,那么这个方法只是返回。 否则,课程将按照The Java™ Language Specification的“执行”一章中的描述进行链接 。
URLclassloader
在java.net包中,jdk提供了一个更加易用的加载器URLclassloader,它扩展了classloader,能够从网络或本地上指定位置加载类。我们可以使用该类做自定义加载器使用。
菜鸟本菜,如有帮助十分荣幸。