高新2

 ------- android培训 java培训期待与您交流! ----------

  类加载器

  Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader

  类加载器也是Java类,因为其他是java类的类加载器本身也要被类加载器加载,显然必须有第一个类加载器不是不是java类,这正是BootStrap。

  Java虚拟机中的所有类装载器采用具有父子关系的树形结构进行组织,在实例化每个类装载器对象时,需要为其指定一个父级类装载器对象或者默认采用系统类装载器为其父级类加载。

  

\

  当Java虚拟机要加载一个类时,到底派出哪个类加载器去加载呢?

  首先当前线程的类加载器去加载线程中的第一个类。

  如果类A中引用了类B,Java虚拟机将使用加载类A的类装载器来加载类B。

  还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。

  每个类加载器加载类时,又先委托给其上级类加载器。

  当所有祖宗类加载器没有加载到类,回到发起者类加载器,还加载不了,则抛ClassNotFoundException,不是再去找发起者类加载器的儿子,因为没有getChild方法,即使有,那有多个儿子,找哪一个呢?

  对着类加载器的层次结构图和委托加载原理,解释先前将ClassLoaderTest输出成jre/lib/ext目录下的itcast.jar包中后,运行结果为ExtClassLoader的原因。

  首先当前线程的类加载器去加载线程中的第一个类。

  如果类A中引用了类B,Java虚拟机将使用加载类A的类装载器来加载类B。

  还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。

  每个类加载器加载类时,又先委托给其上级类加载器。

  当所有祖宗类加载器没有加载到类,回到发起者类加载器,还加载不了,则抛ClassNotFoundException,不是再去找发起者类加载器的儿子,因为没有getChild方法,即使有,那有多个儿子,找哪一个呢?

  对着类加载器的层次结构图和委托加载原理,解释先前将ClassLoaderTest输出成jre/lib/ext目录下的itcast.jar包中后,运行结果为ExtClassLoader的原因。

  一个类加载器的高级问题分析

  编写一个能打印出自己的类加载器名称和当前类加载器的父子结构关系链的MyServlet,正常发布后,看到打印结果为WebAppClassloader。

  把MyServlet.class文件打jar包,放到ext目录中,重启tomcat,发现找不到HttpServlet的错误。

  把servlet.jar也放到ext目录中,问题解决了,打印的结果是ExtclassLoader 。

  父级类加载器加载的类无法引用只能被子级类加载器加载的类,原理如下图:

  

  分析JVM动态生成的类

  创建实现了Collection接口的动态类和查看其名称,分析Proxy.getProxyClass方法的各个参数。

  编码列出动态类中的所有构造方法和参数签名

  编码列出动态类中的所有方法和参数签名

  创建动态类的实例对象

  用反射获得构造方法

  编写一个最简单的InvocationHandler类

  调用构造方法创建动态类的实例对象,并将编写的InvocationHandler类的实例对象传进去

  打印创建的对象和调用对象的没有返回值的方法和getClass方法,演示调用其他有返回值的方法报告了异常。

  将创建动态类的实例对象的代理改成匿名内部类的形式编写,锻炼大家习惯匿名内部类。

  总结思考:让jvm创建动态类及其实例对象,需要给它提供哪些信息?

  三个方面:

  生成的类中有哪些方法,通过让其实现哪些接口的方式进行告知;

  产生的类字节码必须有个一个关联的类加载器对象;

  生成的类中的方法的代码是怎样的,也得由我们提供。把我们的代码写在一个约定好了接口对象的方法中,把对象传给它,它调用我的方法,即相当于插入了我的代码。提供执行代码的对象就是那个InvocationHandler对象,它是在创建动态类的实例对象的构造方法时传递进去的。在上面的InvocationHandler对象的invoke方法中加一点代码,就可以看到这些代码被调用运行了。

  用Proxy.newInstance方法直接一步就创建出代理对象。

  线程池

  线程池的概念与Executors类的应用

  创建固定大小的线程池

  创建缓存线程池

  创建单一线程池

  关闭线程池

  shutdown与shutdownNow的比较

  用线程池启动定时器

  调用ScheduledExecutorService的schedule方法,返回的ScheduleFuture对象可以取消任务。

  支持间隔重复任务的定时方式,不直接支持绝对定时方式,需要转换成相对时间方式。

------- android培训 java培训期待与您交流! ----------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的公寓报修管理系统,源码+数据库+毕业论文+视频演示 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本公寓报修管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此公寓报修管理系统利用当下成熟完善的Spring Boot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。公寓报修管理系统有管理员,住户,维修人员。管理员可以管理住户信息和维修人员信息,可以审核维修人员的请假信息,住户可以申请维修,可以对维修结果评价,维修人员负责住户提交的维修信息,也可以请假。公寓报修管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 关键词:公寓报修管理系统;Spring Boot框架;MySQL;自动化;VUE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值