当前位置: 首页 > wzjs >正文

房子信息查询网站入口苏州网站建设建网站

房子信息查询网站入口,苏州网站建设建网站,网站不排名一切等于零,天津业之峰装修公司地址根据jvm源码剖析类加载机制 java Test.class之后的大致流程 java Test.class ----> 对于windows操作系统 ----> java.exe调用jvm.dll文件创建JVM, ----> 在创建JVM中先由C的代码创建Boostarp(引导)类加载器, ----&g…

根据jvm源码剖析类加载机制

java Test.class之后的大致流程

java Test.class ----> 对于windows操作系统

----> java.exe调用jvm.dll文件创建JVM,

----> 在创建JVM中先由C++的代码创建Boostarp(引导)类加载器,

----> C++代码会创建sun.misc.Launcher.getLauncher()生成Launcher实例(JVM启动器实例)

----> 引导类加载器首先加载sun.misc.Launcher类,

----> 在初始化时执行静态代码块new Launcher(),

----> new的过程中调用Launcher类的构造方法,

----> 在Launcher类的构造方法中,创建ExtClassLoader和AppClassLoader,

----> 并维护三个类加载器的父子关系,将AppClassLoader赋给当前线程的ClassLoader属性和Launcher对象的ClassLoader属性。

----> jvm默认使用sun.misc.Launcher.getClassLoader()返回Launcher对象的ClassLoader对象(AppClassLoader)加载我们程序的类

类的加载过程

加载—校验—准备—解析—初始化—使用—卸载

加载:从磁盘中以IO流的方式读取class文件的字节码

校验:验证class文件合法性,如文件头

准备:为静态变量分配内存,并赋默认值,如boolean类型赋false、int类型赋0

解析:静态链接:将符号引用替换为直接引用,把静态方法替换为指向内存的地址或句柄!!!

初始化:对类的静态变量设置指定的值、执行静态代码块

在这里插入图片描述

类加载器
种类

bootstrapClassLoader(启动/引导)类加载器:由C++创建,负责加载jre/lib下的核心类库

ExtClassLoader扩展类加载器:负责加载jre/lib/ext目录下的类

AppClassLoader应用程序类加载器:负责加载用户自定义路径下的类

import sun.misc.Launcher;
import java.net.URL;public class TestJDKClassLoader {public static void main(String[] args) {//jre/lib下的核心类由启动类加载器加载System.out.println(String.class.getClassLoader());//jre/lib/ext下的类由扩展类加载器加载System.out.println(com.sun.crypto.provider.DESKeyFactory.class.getClassLoader().getClass().getName());//用户类路径下的类由应用程序类加载器加载System.out.println(TestJDKClassLoader.class.getClassLoader().getClass().getName());System.out.println();//获取当前应用程序类加载器ClassLoader appClassLoader = ClassLoader.getSystemClassLoader();ClassLoader extClassloader = appClassLoader.getParent();ClassLoader bootstrapLoader = extClassloader.getParent();System.out.println("the bootstrapLoader : " + bootstrapLoader);System.out.println("the extClassloader : " + extClassloader);System.out.println("the appClassLoader : " + appClassLoader);System.out.println();System.out.println("bootstrapLoader加载以下文件:");//获取引导类加载器加载的jar包路径URL[] urls = Launcher.getBootstrapClassPath().getURLs();for (int i = 0; i < urls.length; i++) {System.out.println(urls[i]);}System.out.println();System.out.println("extClassloader加载以下文件:");System.out.println(System.getProperty("java.ext.dirs"));System.out.println();System.out.println("appClassLoader加载以下文件:");System.out.println(System.getProperty("java.class.path"));}
}
双亲委派原则

在这里插入图片描述

双亲委派机制:当类加载器加载某个类时,先判断类是否已加载,如果没有则委派父类加载器加载,父类加载器判断类是否已加载,如果没有则委派父类加载器加载;如果到引导类加载器(bootstrapClassloader)判断类尚未加载,将尝试加载类,如果加载不到,则指派子类加载器加载。

源码:

​ 在java.lang.ClassLoader.loadClass()方法实现的双亲委派机制:

    //name是加载的全类名,如com.example.demo.Testprotected Class<?> loadClass(String name, boolean resolve)throws ClassNotFoundException{synchronized (getClassLoadingLock(name)) {// First, check if the class has already been loaded//1、判断该类是否已经被加载过Class<?> c = findLoadedClass(name);if (c == null) {long t0 = System.nanoTime();try {//2、如果找不到委派父类加载器加载if (parent != null) {c = parent.loadClass(name, false);} else {c = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// ClassNotFoundException thrown if class not found// from the non-null parent class loader}if (c == null) {// If still not found, then invoke findClass in order// to find the class.long t1 = System.nanoTime();//3、如果父类加载器没有加载到,子类加载器尝试加载c = findClass(name);// this is the defining class loader; record the statssun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);sun.misc.PerfCounter.getFindClasses().increment();}}if (resolve) {resolveClass(c);}return c;}}
设计双亲委派机制的目的

沙箱安全机制:用户自定义的与核心类同名的类不会被加载,而加载的仍是jre定义的类,防止核心库的类和API被篡改;

防止类被重复加载:如果父类加载器已经加过某个类了,子类加载器就不会二次加载了。

自定义类加载器和打破双亲委派原则

自定义类加载器只需要继承 java.lang.ClassLoader 类,该类有两个核心方法:

一个是loadClass(String, boolean),实现了双亲委派机制,若要打破双亲委派原则重写loadClass()方法

一个是findClass,默认实现是空方法,实现了根据全类名加载字节码并返回Class对象,所以我们自定义类加载器主要是重写findClass方法

public class MyClassLoader extends ClassLoader {private String classPath;public MyClassLoader(String classPath) {this.classPath = classPath;}//    @Override
//    protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
//        //自己的包进行加载的时候打破双亲委派原则
//        if(name.contains("com.example.demo")){
//            return findClass(name);
//        }
//
//        //核心包依然由父的类加载器加载
//        return super.loadClass(name, resolve);
//    }@Overrideprotected Class<?> loadClass(String name, boolean resolve)throws ClassNotFoundException {synchronized (getClassLoadingLock(name)) {// First, check if the class has already been loadedClass<?> c = findLoadedClass(name);if (c == null) {long t0 = System.nanoTime();// If still not found, then invoke findClass in order// to find the class.long t1 = System.nanoTime();//指定的类路径下的包 ,不在委托父类加载器进行加载,直接由该类加载器加载if (name.contains("com.example.demo")) {c = findClass(name);} else {c = this.getParent().loadClass(name);}// this is the defining class loader; record the statssun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);sun.misc.PerfCounter.getFindClasses().increment();}if (resolve) {resolveClass(c);}return c;}}@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {try {byte[] data = loadByte(name);//defineClass将一个字节数组转为Class对象,这个字节数组是class文件读取后最终的字数组。return defineClass(name, data, 0, data.length);} catch (IOException e) {throw new ClassNotFoundException();}}private byte[] loadByte(String name) throws IOException {name = name.replaceAll("\\.", "/");FileInputStream fis = new FileInputStream(classPath + "/" + name + ".class");int len = fis.available();byte[] data = new byte[len];fis.read(data);fis.close();return data;}public static void main(String args[]) throws Exception {//初始化自定义类加载器,会先初始化父类ClassLoader,其中会把自定义类加载器的父加载设置为应用程序类加载器AppClassLoaderMyClassLoader classLoader = new MyClassLoader("D:/test");//D盘创建 com/example/demo几级目录,将Test类的复制类Test.class丢入该目录Class clazz = classLoader.loadClass("com.example.demo.Test");Object obj = clazz.newInstance();Method method = clazz.getDeclaredMethod("test", null);method.invoke(obj, null);System.out.println(clazz.getClassLoader().getClass().getName());}
}

注意:自定义类加载器的父类加载器是AppClassLoader。

因为,在new MyClassLoader时,会执行MyClassLoader的父类ClassLoader的无参构造方法,调用getSystemClassLoader(),会返回sun.misc.Launcher类的loader属性,该属性的值就是AppClassLoader对象,在ClassLoader构造方法中将AppClassLoader对象赋值到MyClassLoader的parent属性。

Tomcat打破了双亲委派原则

Tomcat是web容器,所以:

1、会部署多个服务,但每个服务的同一个类路径一样,但版本可能不一样;

2、部署在同一web容器的服务可以共享同一个类,防止同一个类重复加载多次;

3、web容器自己的依赖不能与web应用程序的类混淆,基于安全考虑;

4、web容器支持jsp热更新,通过卸载类加载器重新更新的方式。

所以,tomcat要打破双亲委派原则。


文章转载自:

http://pWpgf1pu.nksbf.cn
http://3w4s6dDB.nksbf.cn
http://aFUxNK6l.nksbf.cn
http://o5jldhAL.nksbf.cn
http://pDpqDSCt.nksbf.cn
http://7JakTtw2.nksbf.cn
http://qqkioYPW.nksbf.cn
http://OXfPLo65.nksbf.cn
http://GpV1M0Pj.nksbf.cn
http://f8Ve77CB.nksbf.cn
http://8ZC9ovTX.nksbf.cn
http://jgYyHWZJ.nksbf.cn
http://fQehjNau.nksbf.cn
http://qnRQ6tTm.nksbf.cn
http://Jvlq8aEV.nksbf.cn
http://P005Hgnv.nksbf.cn
http://Jo10TXSP.nksbf.cn
http://UpFx53ln.nksbf.cn
http://iQAUhsX2.nksbf.cn
http://O4WLAS7P.nksbf.cn
http://aLsUJSFm.nksbf.cn
http://p529BT8Q.nksbf.cn
http://OLvKn0o6.nksbf.cn
http://75xsSWIH.nksbf.cn
http://81FVoFIy.nksbf.cn
http://CnWEHfF2.nksbf.cn
http://HhzLhWA1.nksbf.cn
http://OVVXZhPd.nksbf.cn
http://BGL1VCIq.nksbf.cn
http://466d5hnj.nksbf.cn
http://www.dtcms.com/wzjs/762129.html

相关文章:

  • 网站从建设到上线流程做资源网站有哪些
  • 网站怎么做移动图片大全西安网页制作模板
  • 甘肃县门户网站建设方案深圳工商注册核名查询系统
  • 淮南网站网站建设网站什么时候做解析
  • 郑州冬青街 网站建设有没有免费的小程序制作
  • 如何制作免费的公司网站外链seo软件下载
  • 武安网站制作网站开发 自定义首页显示
  • 常见的网站推广方法哪个公司网站备案快
  • 做数据库与网站招什么人nginx 网站正在建设中
  • 商业空间设计案例网站曲阜网站建设公司
  • 临沂网站公司哪家好做马来西亚生意的网站
  • 中小学校园网站开发技术滴滴一年亏损109亿
  • 南京做网站南京乐识专业门户网站是用户上网的第一入口
  • 公司外贸网站怎么做全网vip影视网站一键搭建
  • 自已做的网站怎么做域名解析引进韩国电影
  • 重庆永川网站建设报价如何制作自己想要的图片
  • 网站策划书如何做网站建设设计简介
  • 腾讯企点怎么群发消息济南网站建设和优化
  • 建设品牌网站公司网站文章页图片大全
  • 哪家手表网站HTML网站页面建设
  • 自己怎么建个优惠网站苏州建设工程信息网
  • 万户网站做网站一年费用
  • CMS网站建设优势静态网页怎么做网站
  • 在线精品课程网站开发做国内网站阿里云怎么样
  • 网站开发外包售后维护合同广州品牌营销服务
  • 网站建设dujujiangxin如何做菠菜网站代理
  • 福建泉州做网站公司特步的网站建设策划
  • 长沙模板建网站需要多久wordpress多个下载地址
  • 网站怎么做直播功能吗网络建设文章网站
  • 网站推广的方法及特点网站建设咨询服务合同