技术标签: javaSE
它是用来加载Class文件到JVM(Java Virtual Machine(Java虚拟机)的缩写)。
以供程序使用的。我们知道,Java程序可以动态加载类定义,而这个动态加载的机制就是
通过ClassLoader来实现的。
其中有一个ClassLoader不是用Java语言所编写的,而是JVM实现的一部分,这个
ClassLoader就是bootstrap classloader(启动类加载器),这个ClassLoader
在JVM运行的时候加载Java核心的API以满足Java程序最基本的需求,其中就包括用户自
定义的ClassLoader,这里所谓的用户自定义是指通过Java程序实现的ClassLoader,
一个是ExtClassLoader,这个ClassLoader是用来加载Java的扩展API的,也就是
/lib/ext中的类。另一个是AppClassLoader,这个ClassLoader是用来加载用户机器
上CLASSPATH设置目录中的class的,通常在没有指定ClassLoader的情况下,我们自
定义的类就由该ClassLoader进行加载。
当运行一个程序的时间,JVM启动,运行bootstrap classloader,该ClassLoader加
载Java核心API(ExtClassLoader和APPClassLoader也在此时被加载),然后调用
ExtClassLoader加载扩展API,最后APPClassLoader加载CLASSPATH目录下定义的
class,这就是一个程序最基本的加载流程。
每一个自定义ClassLoader都必须继承ClassLoader这个抽象类,而每个ClassLoader
都会有一个parent ClassLoader,我们可以看一下ClassLoader这个抽象类中有一个
getParent()方法,这个方法用来返回当前ClassLoader的parent,注意,这个parent
不是指定的被继承的类,而是在实例化该ClassLoader时指定的一个ClassLoader,如果
这个parent为null,那么就默认该ClassLoader的parent是bootstrap classloa-
der,这个parent有什么用呢?
我们可以考虑这样一种情况,假设我们自定义了一个ClientDefClassLoader,我们使用
这个自定义的ClassLoader加载java.lang.String,那么这里String是否会被这个
ClassLoader加载呢?事实上,java.lang.String这个类并不是被这个ClientDef-
ClassLoader加载,而是由bootstrap classloader进行加载,为什么会这样?实际
上这就是双亲委托模式的原因,因为在任何自定义ClassLoader加载一个类之前,它都会
先委托它的父亲ClassLoader进行加载,只有当父亲ClassLoader无法加载成功后,才会
由自己加载,在上面这个例子里,因为java.lang.String是属于Java核心API的一个类,
所以当使用ClientDefClassLoader加载它的时候,该ClassLoader会先委托他的父亲
ClassLoader进行加载,当ClassLoader的parent为null时,ClassLoader的parent
就是bootstrap classloader,所以在ClassLoader的最顶层就是bootstrap
classloader,因此最终委托到bootstrap classloader的时候,bootstrap
classloader就会返回String的Class。
下面我们看一下ClassLoader中的一段源码:
public class Snippet{
protected synchronized Class loadClass(String name,boolean resolve) throws
ClassNotFoundException{
//首先检查该name指定的class是否被加载
Class c = findLoadedClass(name);
if(c==null){
try{
if(parent!=null){
//如果parent不为null,则调用parent的loadClass进行加载
c=parent.loadClass(name,false);
}else{
//如果parent为null,则调用BootstrapClassLoader进行加载
c=findBootstrapClass0(name);
}
}catch(ClassNotFoundException e){
//如果仍然无法加载成功,则调用自身的findClass进行加载
c=findClass(name);
}
}
if(resolve){
resolveClass(c);}
return c;
}
}
从上面的一段代码,我们可以看出一个类加载的大概过程,与我们刚开始所举的例子是一样的,而我们要实现一个自定义类的时间,只需要实现findClass方法即可。
为什么要使用这种双亲委托模式呢?
1:避免重复加载,当父亲已经加载过该类的时候,就没有必要再加载一次了
2:考虑到安全因素,试想一下,如果不使用这种模式,我们可以随时的用自定的String来动态替代java核心API中定义类型,这样存在非常大的安全隐患
文章浏览阅读700次。---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ---------------------- 1. 基础常识————软件开发 ————人机交互方式 ————常用的的DOS命令命令行方式dos命令行,常见的命令 dir :列出当前目录下的文件以及文_合法标识符有 d.v 、 my_name 、class 、3y
文章浏览阅读547次。STM_SETIMAGE或CStatic::SetBitmap(HBITMAP hBitmap)返回的是先前的资源句柄,同时深拷贝一份当前的(参数传入的)资源句柄。解决:win32HBITMAP hOldBmp = (HBITMAP)::SendMessage(m_hWnd, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap);if( NULL..._stm_setimage
文章浏览阅读507次。npm添加淘宝镜像 npm是一个很好用的node的包管理工具,但是在国内用户去拉包的时候速度太慢,经常性的卡死,国内我们使用淘宝镜像,利用淘宝镜像去获取包的话速度快很多。临时使用:npm --registryhttps://registry.npm.taobao.orginstall express持久使用: npm config set registryhttps://r......_switchhost镜像
文章浏览阅读90次。前言Mahout是基于Hadoop用于机器学习的程序开发框架,Mahout封装了3大类的机器学习算法,其中包括聚类算法。kmeans是我们经常会提到用到的聚类算法之一,特别处理未知数据集的时,都会先聚类一下,看看数据集会有一些什么样的规则。本文主要讲解,基于Mahout程序开发,实现分步式的kmeans算法。目录聚类算法kmeansMahout开发环境介绍用Mahou..._mahout种kmeans算法转
文章浏览阅读436次。这篇博客是从旧博客 WordPress 迁移过来,内容可能存在转换异常。凸包:点集Q的凸包(convec hull)是一个最小的凸多边形P,满足Q中的所有点或者在P的边界上,或者在P的内部。例如:点集Q={p0, p1, …,p12}及其以灰色显示的凸包CH(Q)这里介绍一种求凸包所包含点集的方法---Graham Scan。这里在《算法导论》第33章计算几何学的第三节“寻找凸包”讲的很详细,还是..._分治法找凸包c++代码
文章浏览阅读891次。创建用户Import-Csv c:\users\y\desktop\powershell\创建模板.txt | foreach {New-ADUser -Name $_.name -DisplayName $_.displayname -Description $_.description -UserPrincipalName $_.userprincipalname -SamAccountNa...
文章浏览阅读418次。2、计算机科学与技术(嵌入式培养)080901【培养目标】本专业方向内嵌人工智能与网络安全两个方向,主要培养智能科学与技术专业人才和网络信息安全技术人才。人工智能方向培养具备计算机人工智能方向领域的机器学习与模式识别、计算智能等方向坚实的理论基础与工程实践能力,能在软件研发、人工智能相关领域从事系统设计与开发工作,具有较强竞争力的复合型高级工程技术人才和与人工智能学科相关的科研和管理人才。网络安全..._浦江学院 高考志愿 嵌入式培养
文章浏览阅读70次。从K近邻算法、距离度量谈到KD树、SIFT+BBF算法前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章待写:1、KD树;2、神经网络;3、编程艺术第28章。你看到,blog内的文章与你于别处所见的任何都不同。于是,等啊等,等一台电脑,只好等待..”。得益于田,借了我一台电脑(借他电脑的时候,我连表示感谢,他说“能找到工作全靠你的博客,这点儿小忙还说,不地道”,...
文章浏览阅读1.1k次。注:以下是针对单网口且MAC地址连续(一般批量MAC都是连续的)的情况,如果是双网口,请参考最后双网口的配置。烧录原理1、SSD20X平台的MAC地址保存于”ethaddr”这个环境变量中,我们可以通过在Uboot中设置该环境变量,从而设置MAC地址。2、看起来,通过串口输入命令可以实现烧录MAC地址,但是操作比较繁琐(每次都要输入,还要MAC地址递增)。因此,我们可以使用文件来保存MAC地址,文件可以保存到SD卡或者U盘中。3、大概的逻辑是:Uboot启动后,去读取SD卡/U盘中的特定文件(保存_ssd222如何保存mac地址
文章浏览阅读779次,点赞4次,收藏18次。这知识点都是我在工作,还有面试中学习并总结的,差不多都是一些高频面试题,比较深入的知识点,如果在这平时不去总结,不去刷刷面试题的话,可能在你面试的时候就会被面试官怼的一塌糊涂,就算在面试官问出这个问题的时候你知道怎么回事,就是因为没有去总结,就会出现逻辑混乱的情况,从而失去这份工作机会。
文章浏览阅读7.6k次。什么是扩展方法?简而言之,扩展方法是一种开发人员轻松快捷地扩展已有类型的方法定义和实现的机制。具体一点儿讲,首先,扩展方法必须是静态方法,从语法的层面来看它的调用和实例方法没有什么区别,我们还是看码说话吧: 1: public static class ExtensionMethodDemo 2: { 3: public static decimal ToM
文章浏览阅读4.1w次,点赞8次,收藏54次。自己编写的高斯滤波已理解,可是matlab自带的高斯滤波函数却没有用过,这里记录一下。%matlab自带函数实现灰度图高斯滤波clearclose allimg=imread('lena.bmp');sigma=6;%标准差大小window=double(uint8(3*sigma)*2+1);%窗口大小一半为3*sigmaH=fspecial('gaussian', win_matlab 高斯滤波