-----------------------android培训、java培训、java学习型技术博客、期待与您交流! ----------------------
Java基础加强(四)
(一)类加载器
1,含义:就是加载类的工具,我们在Java程序中用到一个类,首先出现一个类的名字,这个时候Java虚拟机就会将这个类的字节码加载到内存中来,通常类的字节码都是放在硬盘上classpath路径下,把.class文件中的内容加载进硬盘中来,再进行一些处理,处理完的结果就是字节码,而这些工作就属于类加载器做的。
2,Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader
友情提示:类加载器也是Java类,因为其他是java类的类加载器本身也要被类加载器加载,显然必须有第一个类加载器不是java 类,这正是BootStrap(它嵌入到java内核中,是使用C++编写的一段二进制代码)。
3,类加载器的委托机制
(1) 当Java虚拟机要加载一个类时,到底派出哪个类加载器去加载呢?
方法一:
首先当前线程的类加载器去加载线程中的第一个类。
如果类A中引用了类B,Java虚拟机将使用加载类A的类装载器来加载类B。
方法二:
可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。
(2)每个类加载器加载类时,又先委托给其上级类加载器。如果所有的加载器都没有加载到类,回到发起者类加载器,还加载不了,则抛ClassNotFoundException。
(二)代理
1,AOP:(Aspectoriented program)面向方面的编程
AOP的目标就是要使交叉业务模块化。可以采用将切面代码移动到原始方法的周围,这与直接在方法中编写切面代码的运行效果是一样的,使用代理技术正好可以解决这种问题,代理是实现AOP功能的核心和关键技术。
友情提示:交叉业务:安全,事务,日志等功能要贯穿到好多个模块中,所以,它们就是交叉业务
2,动态代理类:JVM可以在运行期动态生成出类的字节码,这种动态生成的类往往被用作代理类,即动态代理类
(1)动态代理类的特点:JVM生成的动态类必须实现一个或多个接口
友情提示:如果要为一个没有实现接口的类生成动态代理类,那么可以使用CGLIB库(CGLIB库可以动态生成一个类的子类,一个类的子类也可以用作该 类的代理)。
(2)JVM动态生成的类
1,创建动态类的实例对象
(1) 用反射获得构造方法
(2) 编写一个最简单的InvocationHandler类
(3) 调用构造方法创建动态类的实例对象,并将编写的InvocationHandler类的实例对象传进去
(4) 打印创建的对象和调用对象的没有返回值的方法和getClass方法,演示调用其他有返回值的方法报告了异常。
(5) 将创建动态类的实例对象的代理改成匿名内部类的形式编写,锻炼大家习惯匿名内部类。
友情提示:让jvm创建动态类及其实例对象,需要给它提供三个方法信息:
(1)生成的类中有哪些方法,通过让其实现哪些接口的方式进行告知;
(2)产生的类字节码必须有个一个关联的类加载器对象;
(3)生成的类中的方法的代码是怎样的,也得由我们提供。把我们的代码写在一个约定好了接口对象的方法中,把对象传给它,它调用我的方法,即相当于插入了我的代码。提供执行代码的对象就是那个InvocationHandler对象,它是在创建动态类的实例对象的构造方法时传递进去的。在上面的InvocationHandler对象的invoke方法中加一点代码,就可以看到这些代码被调用运行了。
2, 用Proxy.newInstance方法直接一步就创建出代理对象。
3,实现AOP功能的封装与配置
(1)工厂类BeanFactory负责创建目标类或代理类的实例对象,并通过配置文件实现切换。其getBean方法根据参数字符串返回一个相应的实例对象,如果参数字符串在配置文件中对应的类名不是ProxyFactoryBean,则直接返回该类的实例对象,否则,返回该类实例对象的getProxy方法返回的对象。
(2)BeanFactory的构造方法接收代表配置文件的输入流对象,配置文件格式如下:
#xxx=java.util.ArrayList:(Object obj =BeanFactory.getBean("xxx")有一个Bean工厂,它有一个getBean()方法的功能,当该功能中传入的参数时xxx的时候,它就自动到配置文件中去寻找xxx的实例对象。)
xxx=cn.itcast.ProxyFactoryBean:(ProxyFacotryBean充当封装生成动态代理的工厂,BeanFactory中的方法如果发现xxx不是ProxyFactoryBean的对象,那么它就直接创建java.util.ArrayList的对象,如果发现它是ProxyFactoryBean的对象,那么它就不直接访问它,而是访问它所创建的代理)
xxx.target=java.util.ArrayList
xxx.advice=cn.itcast.MyAdvice
友情提示:StringBuild与StringBuffer之间的区别:它们在用法上基本相同,都是动态的往字符串上添加内容,在单线程的情况下,StringBuild效率会高一点,不需要考虑安全;在多线程的情况下,要使用StringBuffer,需要考虑到线程安全
-----------------------android培训、java培训、java学习型技术博客、期待与您交流! ----------------------