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

做网站素材在哪找搜索引擎优化的简称

做网站素材在哪找,搜索引擎优化的简称,中学生怎么做网站,网站开发工具推荐目录 概述 作用 如何指定加载类的类加载器#xff1f; 面试题 打破双亲委派机制 自定义类加载器 线程上下文类加载器 Osgi框架的类加载器 概述 由于Java虚拟机中有多个类加载器#xff0c;双亲委派机制的核心是解决一个类到底由谁加载的问题 双亲委派机制#xff…目录 概述 作用 如何指定加载类的类加载器 面试题 打破双亲委派机制 自定义类加载器 线程上下文类加载器 Osgi框架的类加载器 概述 由于Java虚拟机中有多个类加载器双亲委派机制的核心是解决一个类到底由谁加载的问题 双亲委派机制当一个类加载器接收到加载类的任务时会自底向上查找是否加载过再由顶向下进行加载 每个类加载器都有一个父类加载器在类加载的过程中每个类加载器都会先检查是否已经加载了该类如果已经加载则直接返回否则会将加载请求委派给父类加载器 向上查找如果已经加载过就直接返回Class对象加载过程结束这样就能避免一个类重复加载 如果所有的父类加载器都无法加载该类则由当前类加载器自己尝试加载看上去是自顶向下尝试加载 向下委派加载起到了一个加载优先级的作用 父类加载器的小细节 每个Java实现的类加载器中保存了一个成员变量叫“父”Parent类加载器可以理解为它的上级并不是继承关系 应用程序类加载器的parent父类加载器是扩展类加载器 扩展类加载器的parent是空但是在代码逻辑上扩展类加载器依然会把启动类加载器当成父类加载器处理 启动类加载器使用C编写没有父类加载器 类加载器的父子关系可以通过 classloader -t 查看 作用 保证类加载的安全性。通过双亲委派机制避免恶意代码替换JDK中的核心类库比如java.lang.String确保核心类库的完整性和安全性避免重复加载。双亲委派机制可以避免同一个类被多次加载 如何指定加载类的类加载器 在Java中如何使用代码的方式去主动加载一个类呢 方式1使用Class.forName方法使用当前类的类加载器去加载指定的类 方式2获取到类加载器通过类加载器的loadClass方法指定某个类加载器加载 例如 面试题 1.如果一个类重复出现在三个类加载器的加载位置应该由谁来加载 启动类加载器加载根据双亲委派机制它的优先级是最高的 2.String类能覆盖吗在自己的项目中去创建一个java.lang.String类会被加载吗 不能会返回启动类加载器加载在rt.jar包中的String类 3.类的双亲委派机制是什么 当一个类加载器去加载某个类的时候会自底向上查找是否加载过如果加载过就直接返回如果一直到最顶层的类加载器都没有加载再由顶向下进行加载应用程序类加载器的父类加载器是扩展类加载器扩展类加载器的父类加载器是启动类加载器双亲委派机制的好处有两点第一是避免恶意代码替换JDK中的核心类库比如java.lang.String确保核心类库的完整性和安全性第二是避免一个类重复地被加载 打破双亲委派机制 打破双亲委派机制历史上有三种方式但本质上只有第一种算是真正的打破了双亲委派机制 自定义类加载器并且重写loadClass方法。Tomcat通过这种方式实现应用之间类隔离《面试篇》中分享它的做法线程上下文类加载器。利用上下文类加载器加载类比如JDBC和JNDI等Osgi框架的类加载器。历史上Osgi框架实现了一套新的类加载器机制允许同级之间委托进行类的加载目前很少使用 自定义类加载器 一个Tomcat程序中是可以运行多个Web应用的如果这两个应用中出现了相同限定名的类比如Servlet类Tomcat要保证这两个类都能加载并且它们应该是不同的类 如果不打破双亲委派机制当应用类加载器加载Web应用1中的MyServlet之后Web应用2中相同限定名的MyServlet类就无法被加载 Tomcat使用了自定义类加载器来实现应用之间类的隔离 每一个应用会有一个独立的类加载器加载对应的类 ClassLoader中包含了4个核心方法双亲委派机制的核心代码就位于loadClass方法中 public Class? loadClass(String name) 类加载的入口提供了双亲委派机制。内部会调用findClass 重要protected Class? findClass(String name) 由类加载器子类实现,获取二进制数据调用defineClass 比如URLClassLoader会根据文件路径去获取类文件中的二进制数据。重要protected final Class? defineClass(String name, byte[] b, int off, int len) 做一些类名的校验然后调用虚拟机底层的方法将字节码信息加载到虚拟机内存中protected final void resolveClass(Class? c) 执行类生命周期中的连接阶段 实现打破双亲委派机制 import org.apache.commons.io.IOUtils;import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.security.ProtectionDomain; import java.util.regex.Matcher;/*** 打破双亲委派机制 - 自定义类加载器*/public class BreakClassLoader1 extends ClassLoader {private String basePath;private final static String FILE_EXT .class;//设置加载目录public void setBasePath(String basePath) {this.basePath basePath;}//使用commons io 从指定目录下加载文件private byte[] loadClassData(String name) {try {String tempName name.replaceAll(\\., Matcher.quoteReplacement(File.separator));FileInputStream fis new FileInputStream(basePath tempName FILE_EXT);try {return IOUtils.toByteArray(fis);} finally {IOUtils.closeQuietly(fis);}} catch (Exception e) {System.out.println(自定义类加载器加载失败错误原因 e.getMessage());return null;}}//重写loadClass方法Overridepublic Class? loadClass(String name) throws ClassNotFoundException {//如果是java包下还是走双亲委派机制if(name.startsWith(java.)){return super.loadClass(name);}//从磁盘中指定目录下加载byte[] data loadClassData(name);//调用虚拟机底层方法方法区和堆区创建对象return defineClass(name, data, 0, data.length);}public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException {//第一个自定义类加载器对象BreakClassLoader1 classLoader1 new BreakClassLoader1();classLoader1.setBasePath(D:\\lib\\);Class? clazz1 classLoader1.loadClass(com.itheima.my.A);//第二个自定义类加载器对象BreakClassLoader1 classLoader2 new BreakClassLoader1();classLoader2.setBasePath(D:\\lib\\);Class? clazz2 classLoader2.loadClass(com.itheima.my.A);System.out.println(clazz1 clazz2);Thread.currentThread().setContextClassLoader(classLoader1);System.out.println(Thread.currentThread().getContextClassLoader());System.in.read();} } 问题1自定义类加载器父类怎么是AppClassLoader呢 默认情况下自定义类加载器的父类加载器是应用程序类加载器 以JDK8为例ClassLoader类中提供了构造方法设置parent的内容 这个构造方法由另外一个构造方法调用其中父类加载器由getSystemClassLoader方法设置该方法返回的是AppClassLoader 问题2两个自定义类加载器加载相同限定名的类不会冲突吗 不会冲突在同一个Java虚拟机中只有相同类加载器相同的类限定名才会被认为是同一个类 在Arthas中使用sc –d 类名的方式查看具体的情况 public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException {//第一个自定义类加载器对象BreakClassLoader1 classLoader1 new BreakClassLoader1();classLoader1.setBasePath(D:\\lib\\);Class? clazz1 classLoader1.loadClass(com.itheima.my.A);//第二个自定义类加载器对象BreakClassLoader1 classLoader2 new BreakClassLoader1();classLoader2.setBasePath(D:\\lib\\);Class? clazz2 classLoader2.loadClass(com.itheima.my.A);System.out.println(clazz1 clazz2); } 打印的是false因为两个类加载器不同尽管加载的是同一个类名最终Class对象也不是相同的 线程上下文类加载器 利用上下文类加载器加载类比如JDBC和JNDI等 JDBC案例 JDBC中使用了DriverManager来管理项目中引入的不同数据库的驱动比如mysql驱动、oracle驱动 import com.mysql.cj.jdbc.Driver;import java.sql.*;/*** 打破双亲委派机制 - JDBC案例*/public class JDBCExample {// JDBC driver name and database URLstatic final String JDBC_DRIVER com.mysql.cj.jdbc.Driver;static final String DB_URL jdbc:mysql:///bank1;// Database credentialsstatic final String USER root;static final String PASS 123456;public static void main(String[] args) {Connection conn null;Statement stmt null;try {conn DriverManager.getConnection(DB_URL, USER, PASS);stmt conn.createStatement();String sql;sql SELECT id, account_name FROM account_info;ResultSet rs stmt.executeQuery(sql);//STEP 4: Extract data from result setwhile (rs.next()) {//Retrieve by column nameint id rs.getInt(id);String name rs.getString(account_name);//Display valuesSystem.out.print(ID: id);System.out.print(, Name: name \n);}//STEP 5: Clean-up environmentrs.close();stmt.close();conn.close();} catch (SQLException se) {//Handle errors for JDBCse.printStackTrace();} catch (Exception e) {//Handle errors for Class.forNamee.printStackTrace();} finally {//finally block used to close resourcestry {if (stmt ! null)stmt.close();} catch (SQLException se2) {}// nothing we can dotry {if (conn ! null)conn.close();} catch (SQLException se) {se.printStackTrace();}//end finally try}//end try}//end main }//end FirstExample DriverManager属于rt.jar是启动类加载器加载的而用户jar包中的驱动需要由应用类加载器加载这就违反了双亲委派机制  DriverManager怎么知道jar包中要加载的驱动在哪儿 SPI机制SPI全称为Service Provider Interface是JDK内置的一种服务提供发现机制 SPI的工作原理 1.在ClassPath路径下的META-INF/services文件夹中以接口的全限定名来命名文件名对应的文件里面写该接口的实现 2.使用ServiceLoader加载实现类 总结 JDBC案例中真的打破了双亲委派机制吗 分别从DriverManager以及驱动类的加载流程上分析JDBC只是在DriverManager加载完之后通过初始化阶段触发了驱动类的加载类的加载依然遵循双亲委派机制 所以没有打破双亲委派机制只是用一种巧妙的方法让启动类加载器加载的类去引发的其他类的加载 Osgi框架的类加载器 历史上OSGi模块化框架它存在同级之间的类加载器的委托加载OSGi还使用类加载器实现了热部署的功能 热部署指的是在服务不停止的情况下动态地更新字节码文件到内存中 案例使用阿里arthas不停机解决线上问题 背景小李的团队将代码上线之后发现存在一个小bug但是用户急着使用如果重新打包再发布需要一个多小时的时间所以希望能使用arthas尽快的将这个问题修复 思路 1.在出问题的服务器上部署一个arthas并启动 2.jad --source-only 类全限定名 目录/文件名.java jad 命令反编译然后可以用其它编译器比如vim 来修改源码 3.mc –c 类加载器的hashcode 目录/文件名.java -d 输出目录 mc 命令用来编译修改过的代码 4.retransform class文件所在目录/xxx.class 用 retransform 命令加载新的字节码 使用retransform不能添加方法或者字段也不能更新正在执行中的方法
http://www.dnsts.com.cn/news/109369.html

相关文章:

  • 大连网站设计团队深圳软件开发工资一般多少
  • 汕头网站制作找谁相册管理网站模板
  • 黄河道网站建设公司万网虚拟主机两个网站
  • 商标注册 网站建设如何入账饭店装修设计
  • 高效的客户管理crm系统一键优化助手
  • 做交网站企业招聘网
  • 怎么做网站步骤免费的做一个学校网站
  • 新网站建设的工作总结深圳保障住房轮候查询
  • 万网官方网站网站界面切片做程序
  • 食品企业网站模板wordpress login 必应壁纸 插件
  • 建什么网站做cpawordpress 伪静态原理
  • 企业做网站天津点评网页设计作业
  • 公司网站的建设要注意什么建设网站平台哪里最好
  • 网站建设公司哪家最好网站网页建设实训心得体会
  • wap网站开发和自适应九龙坡区网站建设
  • 项目推广计划书邯郸做seo网站优化
  • 广宁城乡建设网站广州黄埔做网站的公司哪家好
  • 陕西省煤炭建设公司第一中学官方网站图片编辑软件手机版
  • 仿一个展示型网站多少钱建设银行人力资源系统网站
  • 网站排名查询系统影视自助建站系统源码
  • 吉林省城乡建设厅网站6模拟建筑
  • 承德做网站的公司自己建设网站怎么做
  • 建设部网站诚信平台创业网站怎么做
  • 企业门户网站开发源码想开个网站怎么做
  • 网站建设选方舟网络高端网站建设的介绍
  • 常州网站建站公司做化验的在哪个网站里投简历
  • 现在还有做静态网站的酒店电子商务网站建设
  • 官方网站下载派的appwordpress用户名密码注册
  • 织梦网站后台一键更新没反应淮北市建筑
  • 网站站点风格合肥网络营销公司