---------------------- android培训、java培训、期待与您交流! ----------------------
类加载器及其委托机制的深入分析:
一.类加载器:
1.简要介绍什么是类加载器和类加载器的作用
2.Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器每个类负责加载特定位置的类:
BootStrap,ExtClassLoader,AppClassLoader
3.类加载器也是Java类,因为其他是Java类的类加载器本身也要被类加载器加载,显然必须有第一个类加载器不
是java类,这正是BootStrap
4.Java虚拟机中的所有类加载器采用具有父子关系的树形结构进行组织,在实例化每个类加载器对象时,需要为其指定一个父级类加载器
对象或者默认采用系统类加载器为其父类加载
二.类加载器的委托机制:
1、当Java虚拟机要加载一个类时,到底派出哪个类加载器去加载呢?
首先当前线程的类加载器去加载线程中的第一个类
如果类A中引用了类B,Java虚拟机将使用加载类A的类加载器来加载类B
还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类
2.每个类加载器加载类时,又先委托给其上级类加载器
当所有祖宗类加载器没有加载到类,回到发起者类加载器,还加载不了,则抛ClassNotFoundException,不是再去找发起者类加载器的儿子,因为没有getChild方法,即使有,那有多个儿子,找哪一个呢?
对着类加载器的层次结构图和委托加载原理,解释先前将ClassLoaderTest输出成jre/lib/ext目录下的itcast.jar包中后,运行结果为:ExtClassLoader原因.
3.每个ClassLoader本身只能分别加载特定位置和目录中的类,但它们可以委托其他的类加载器去加载类,这就是类加载器的委托模式。
类加载器一级级委托到BootStrap类加载器,当BootStrap无法加载当前所要加载的类时,然后才一级级回退到子孙类加载器去进行真正的加载,
当回退到最初的类加载器时,如果它自己也不能完成类的加载,那就应报告ClassNotFoundException异常。
4.有一道面试题,能不 能自己写个类叫java.lang.System,为了不让我们写System类,类加载采用委托机制,这样可以保证爸爸们优先,也就是总是使用爸爸们
能找到的类,这样总是使用Java系统提供的System.
编写自己的类加载器:
编程步骤:
编定一个对文件内容进行简单加密的程序
编写了一个自己的类加载器,可实现对加密过的类进行器加载和解密
编定一个程序调用类加载器加载类,在源程序中不能用该类名定义引用变量,因为编译
器无法识别这个类。程序中可以除了使用ClassLoader 方法之外,还可以使用设置线程上下文
类加载器或者系统类器加载器,然后再使用Class.forName.
代理的概念与作用
1.生活中的代理:
武汉众武汉的代理商手中买联想电脑和直接跑到北京传智播客旁边来找联想总部买电脑 你觉得最终的主体业务目标有什么区别吗?基本上一样吧,
都解决了核心问题,但是,一点区别都没有吗?从代理商那里买真的一点好处都没有吗?
2.程序中的代理:
要为已存在的多个具有相同接口的目标类的各个方法增加一些系统功能 。例如:
异常处理,日志,计算方法的运行时间 ,事务管理,等等
你准备如何做?
编写一个与目标类具有相同接口的代理类,代理类的每个方法调用目标类的相同方法,并在调用方法时加上系统功能的代码
如果采用工厂模式和配置文件的方式进行管理,则不需要修改客户端程序,在配置文件中配置是使用目标类,还是代理类,这样以后很容易切换
譬如,想要日志功能时就配置代理类,否则配置目标类,这样,增加系统功能很容易,以后运行一段时间后,又想去掉系统功能也很容易。
动态代理技术:
1.要为系统中的各种接口的类增加代理功能,那将需要太多的代理类,全部采用静态代理方式,将是一件非常麻烦的事情.
2.JVM可以在运行期动态生成出类的字节码,这种动态生成的类往往被用作代理类,即动态代理类
3.JVM生成的动态类必须实现一个或多个接口,所以JVM生成的动态类只能用作具有相同接口的目标类的代理
4.CGLIB库可以动态生成一个类的子类,一个类的子类也可以用作该类的代理,所以,如果要为一个没有实现接口的类生成动态代理类,那么可以使用CGLIB库
5.代理类的各个方法中通常除了要调用目标的相应方法和对外返回目标返回的结果 ,还可以在代理方法中的如下四个位置加上系统功能代码 :
(1)在调用目标方法之前
(2)在调用目标方法之后
(3)在调用目标方法前后
(4)在处理目标方法异常的catch块中
分析JVM动态生成的类:
让JVM创建动态类及其实例对象,需要给它提供哪些信息?
三个方面:
(1)生成的类中有哪些方法,通过让其实现哪些接口的方式进行告知;
(2)产生的类字节参与必须有一个关联的类加载器对象;
(3)生成的类中的方法的代码是怎样的,也得由我们提供,把我们的代码写在一个约定好了接口对象的方法中,
把对象传递给它,它调用我的方法,即相当于插入了我的代码,提供执行代码的对象不是那个InvocationHandler对象,它是在创建动态类的实例对象的构造方法时传递进去的,在上面的InvocationHandler对象
的invoke方法中加一点代码,就可以看到这些代码被调用运行了
让动态生成的类成为目标类的代理:
分析动态代理的工作原理图
---------------------- android培训、java培训、期待与您交流! ----------------------