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

17网站一起做网店下载公司做一个静态网站多少钱

17网站一起做网店下载,公司做一个静态网站多少钱,做医疗科普的网站,网站建设价格标准信息类加载的过程 加载 通过类名查找.class文件#xff08;如从磁盘、网络等#xff09;#xff0c;将字节码读入内存。在堆中生成该类的Class对象#xff08;后续访问入口#xff09;。 链接 验证#xff1a;检查字节码合法性#xff08;如文件格式、语法#xff09;。准…类加载的过程 加载 通过类名查找.class文件如从磁盘、网络等将字节码读入内存。在堆中生成该类的Class对象后续访问入口。 链接 验证检查字节码合法性如文件格式、语法。准备为类静态变量分配内存并赋默认值如 int 初始化为 0。解析将符号引用如方法名替换为直接内存地址。 初始化 执行静态变量的显式赋值如 static int a5;和静态代码块static{}。JVM保证多线程下初始化仅执行一次。 ⚠️ 类是按需动态加载的用时才加载非一次性加载所有类。 案例演示 public class Demo {static int value 10; // 显式赋值在初始化阶段执行static { System.out.println(静态块执行); }public static void main(String[] args) {System.out.println(Demo.value); } }执行过程 加载找到Demo.class创建堆中Class对象。链接-准备为value分配内存赋默认值 0。初始化 执行 value10显式赋值执行静态块 → 打印 静态块执行 main方法调用 System.out.println(Demo.value) → 输出 10。 关键点 若类未初始化如未调用main静态代码块不会执行。静态变量在准备阶段分配空间默认值初始化阶段才赋值。 类加载器 ClassLoader分类 1. 启动类加载器Bootstrap Class Loader 实现由JVM内核的C代码实现非Java类。职责加载核心类库如java.lang包中的String、Object等路径为JAVA_HOME/lib。特点唯一无父类加载器无法通过Java代码获取String.class.getClassLoader()返回null。 2. 扩展类加载器Extension Class Loader 实现Java实现sun.misc.Launcher$ExtClassLoader。职责加载JAVA_HOME/lib/ext目录的扩展类库如javax.*包。特点父加载器为Bootstrap。 3. 应用类加载器Application Class Loader 实现Java实现sun.misc.Launcher$AppClassLoader。职责加载用户类路径ClassPath下的类即项目代码及第三方jar包。特点默认的类加载器父加载器为Extension。 4. 自定义类加载器 实现用户继承ClassLoader类重写findClass()方法。用途按需动态加载如热部署、隔离类如Tomcat隔离Web应用打破双亲委派。 双亲委派机制 双亲委派机制介绍 当一个类加载器收到了类加载的请求的时候他不会直接去加载指定的类而是把这个请求委托给自己的父加载器去加载。只有父加载器无法加载这个类的时候才会由当前这个加载器来负责类的加载。 双亲委派机制的作用 比如一个定义在java.lang包下的类因为它被存放在rt.jar之中所以在被加载过程汇总会被一直委托到Bootstrap ClassLoader最终由Bootstrap ClassLoader所加载。 而一个用户自定义的com.hollis.ClassHollis类他也会被一直委托到Bootstrap ClassLoader但是因为Bootstrap ClassLoader不负责加载该类那么会在由Extention ClassLoader尝试加载而Extention ClassLoader也不负责这个类的加载最终才会被Application ClassLoader加载。 这种机制有几个好处。 首先通过委派的方式可以避免类的重复加载当父加载器已经加载过某一个类时子加载器就不会再重新加载这个类。 另外通过双亲委派的方式还保证了安全性。因为Bootstrap ClassLoader在加载的时候只会加载%JRE_HOME%/lib中的jar包里面的类如java.lang.Integer那么这个类是不会被随意替换的除非有人跑到你的机器上 破坏你的JDK。 那么就可以避免有人自定义一个有破坏功能的java.lang.Integer被加载。这样可以有效的防止核心Java API被篡改。 父子加载器之间的关系是继承吗 很多人看到父加载器、子加载器这样的名字就会认为Java中的类加载器之间存在着继承关系。 甚至网上很多文章也会有类似的错误观点。 这里需要明确一下双亲委派模型中类加载器之间的父子关系一般不会以继承Inheritance的关系来实现而是都使用组合Composition关系来复用父加载器的代码的。 如下为ClassLoader中父加载器的定义 public abstract class ClassLoader {// The parent class loader for delegationprivate final ClassLoader parent;}双亲委派是怎么实现的 实现双亲委派的代码都集中在java.lang.ClassLoader的loadClass()方法之中 // 双亲委派机制核心实现 (java.lang.ClassLoader 源码简化版) protected Class? loadClass(String name, boolean resolve) {synchronized (getClassLoadingLock(name)) {// 1、检查请求的类是否已经被加载过了Class? c findLoadedClass(name);if (c null) {try {// 2、将类加载请求先委托给父类加载器if (parent ! null) {// 父类加载器不为空时委托给父类加载进行加载c parent.loadClass(name, false);} else {// 父类加载器为空则代表当前是Bootstrap从Bootstrap中加载类c findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// 如果父类加载器抛出ClassNotFoundException// 说明父类加载器无法完成加载请求// 父加载器加载失败不报错继续}// 3、在父类加载器无法加载的时候再调用本身的findClass方法来进行类加载if (c null) {c findClass(name); // 关键自定义加载点}}return c;} }代码不难理解主要就是以下几个步骤 1、先检查类是否已经被加载过 2、若没有加载则调用父加载器的loadClass()方法进行加载 3、若父加载器为空则默认使用启动类加载器作为父加载器。 4、如果父类加载失败抛出ClassNotFoundException异常后再调用自己的findClass()方法进行加载。 自定义类加载器 自定义类加载器实现 import java.io.File; import java.io.FileInputStream; import java.io.IOException;public class SimpleClassLoader extends ClassLoader {private final String classPath; // 类文件存放路径public SimpleClassLoader(String classPath) {this.classPath classPath;}// 核心方法重写findClass// 不破坏双亲委派模型:只重写 findClass()不重写 loadClassJVM会先尝试用父加载器加载失败时才调用我们的自定义逻辑Overrideprotected Class? findClass(String name) throws ClassNotFoundException {try {// 1. 读取.class文件字节码byte[] classBytes loadClassData(name);// 2. 将字节码转换为Class对象return defineClass(name, classBytes, 0, classBytes.length);} catch (IOException e) {throw new ClassNotFoundException(name, e);}}// 从文件系统加载字节码private byte[] loadClassData(String className) throws IOException {// 将包路径转换为文件路径 (com.example.Test - com/example/Test.class)String path classPath File.separator className.replace(., File.separatorChar) .class;try (FileInputStream fis new FileInputStream(path)) {byte[] buffer new byte[fis.available()];fis.read(buffer);return buffer;}} }测试类 public class TestClass {public void print() {System.out.println(成功使用自定义加载器加载此方法!);} }使用示例 public class Main {public static void main(String[] args) throws Exception {// 1. 创建自定义加载器从当前目录的classes文件夹加载SimpleClassLoader loader new SimpleClassLoader(./classes);// 2. 加载TestClass类Class? clazz loader.loadClass(TestClass);// 3. 创建实例并调用方法Object instance clazz.getDeclaredConstructor().newInstance();clazz.getMethod(print).invoke(instance);} }打破双亲委派机制 自定义类加载器 自定义类加载器并且重写loadClass方法就可以将双亲委派机制的代码去除Tomcat通过这种方式实现应用之间类隔离 线程上下文加载器 利用上下文类加载器加载类比如JDBC和JNDI等。SPI机制线程上下文类加载器 场景1: Tomcat 在初学时部署项目我们是把war包放到tomcat的webapp下这意味着一个tomcat可以运行多个Web应用程序。 那假设我现在有两个Web应用程序它们都有一个类叫做User并且它们的类全限定名都一样比如都是com.yyy.User。但是他们的具体实现是不一样的。那么Tomcat是如何保证它们是不会冲突的呢 答案就是Tomcat给每个 Web 应用创建一个类加载器实例WebAppClassLoader该加载器重写了loadClass方法优先加载当前应用目录下的类如果当前找不到了才一层一层往上找。那这样就做到了Web应用层级的隔离。 并不是Web应用程序下的所有依赖都需要隔离的比如Redis就可以Web应用程序之间共享如果有需要的话因为如果版本相同没必要每个Web应用程序都独自加载一份啊。 做法也很简单Tomcat就在WebAppClassLoader上加了个父类加载器SharedClassLoader如果WebAppClassLoader自身没有加载到某个类那就委托SharedClassLoader去加载。无非就是把需要应用程序之间需要共享的类放到一个共享目录下嘛 为了隔绝Web应用程序与Tomcat本身的类又有类加载器(CatalinaClassLoader)来装载Tomcat本身的依赖。 如果Tomcat本身的依赖和Web应用还需要共享那么还有类加载器(CommonClassLoader)来装载进而达到共享。 各个类加载器的加载目录可以到tomcat的catalina.properties配置文件上查看 场景2: JDBC 在JDBC驱动加载的场景中Java核心库的DriverManager需要加载第三方厂商的JDBC驱动实现类。由于DriverManager位于rt.jar包中由Bootstrap类加载器加载而厂商的驱动实现类在应用classpath下由AppClassLoader加载。这就不符合双亲委派机制的规定。 类加载器命名空间可见性 子可见父子加载器可直接访问父加载器加载的类。父不见子父加载器无法访问子加载器加载的类。 DriverManager是如何准确找到第三方的驱动的它使用了spi机制。 SPI JDK 提供的标准接口供服务提供者实现如数据库驱动、日志框架。目的 动态加载实现类无需修改调用方代码即“面向接口编程运行时替换实现”。工作流程 定义接口如 java.sql.Driver提供实现如 MySQL 的 com.mysql.cj.jdbc.Driver注册配置在 META-INF/services/接口全限定名 文件中声明实现类运行时发现通过 ServiceLoader 自动加载匹配的实现类。 SPI 标准接口 实现类配置文件 动态加载*解决灵活扩展的底层机制。 又有一个问题DriverManager是在rt.jar下的那它是如何委托我们的应用程序类加载器的? 采用了线程的上下文类加载器我们可以来看看serviceloader的源码。 这段代码其实就是获取了加载器然后使用迭代器进去加载器驱动我们进入load方法。 可以看见cl就是通过线程获取的加载器它就是我们的应用类加载器。 我们可以来总结一下JDBC的流程 启动类加载器加载DriverManager。在初始化DriverManager的时候通过spi机制去找到要加载的驱动spi机制使用了线程上下文类加载器也就是应用程序类加载器来加载我们的驱动。
http://www.hkea.cn/news/14326886/

相关文章:

  • 网站开发流程 知乎大连建站
  • 垂直门户网站都有什么sdk广告平台
  • 中华保险网站职高网站建设例题
  • 福州市建网站公司网站域名注销流程
  • 做网站怎么云存储品牌广告和效果广告的区别
  • t恤图案设计网站网站后台登陆代码
  • 免费做网站表白cms系统使用教程
  • 网站架设建设怎么做网站内的搜索
  • 服装毕业设计代做网站电商网站开发进度表
  • 太原网站网络推广成都关键词优化技术
  • 企业网站建设合同 百度文库郑州防控升级
  • 怎么做网站网站赚钱如何用手机制作网页链接
  • 服务器做视频网站建设局网站更改法人所需材料
  • 做爰网站贴吧宜宾网站建设宜宾
  • icp网站备案查询中小企业网站的建设实践报告
  • 营销型网站的特征经常浏览不良网站会被记录吗
  • 怎么把自己做的网站让外网访问建站行业突破
  • 亿唐网不做网站做品牌原因新手建立网站的步骤
  • 做外贸女装有哪些网站长沙装修公司排名前十名
  • 网站建设的说辞全国企业信息系统查询系统
  • 怎么样进行网站建设贵阳网站建设钟鼎网络
  • 阿里巴巴网站上面产品描述一般怎么做的电子商务网站建设技巧
  • 诸城 建设外贸网站建设部网站 合同格式
  • 佛山企业网站建设多少钱学院网站建设实例
  • 福建省建设银行招聘网站建设网银官网
  • 网站应包括的基本功能和高级功能哪些企业需要做网站
  • 济南住房和城乡建设部网站网站做备案到哪去
  • 网站后台哪些功能需要前端配合个人网页设计文档说明模板
  • 用vue的网站专业行业网站建设
  • 为什么有的网站只有版权没有备案如何做原创小说网站