黑马程序员--Java基础加强(四)

-----------------------android培训java培训java学习型技术博客、期待与您交流! ----------------------

Java基础加强(四)

(一)类加载器

1,含义:就是加载类的工具,我们在Java程序中用到一个类,首先出现一个类的名字,这个时候Java虚拟机就会将这个类的字节码加载到内存中来,通常类的字节码都是放在硬盘上classpath路径下,把.class文件中的内容加载进硬盘中来,再进行一些处理,处理完的结果就是字节码,而这些工作就属于类加载器做的。

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

友情提示:类加载器也是Java类,因为其他是java类的类加载器本身也要被类加载器加载,显然必须有第一个类加载器不是java 类,这正是BootStrap(它嵌入到java内核中,是使用C++编写的一段二进制代码)。

3,类加载器的委托机制

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

方法一:

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

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

方法二:

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

2)每个类加载器加载类时,又先委托给其上级类加载器。如果所有的加载器都没有加载到类,回到发起者类加载器,还加载不了,则抛ClassNotFoundException

(二)代理

1AOP:(Aspectoriented program)面向方面的编程

AOP的目标就是要使交叉业务模块化。可以采用将切面代码移动到原始方法的周围,这与直接在方法中编写切面代码的运行效果是一样的,使用代理技术正好可以解决这种问题,代理是实现AOP功能的核心和关键技术。

友情提示:交叉业务:安全,事务,日志等功能要贯穿到好多个模块中,所以,它们就是交叉业务

2,动态代理类:JVM可以在运行期动态生成出类的字节码,这种动态生成的类往往被用作代理类,即动态代理类

1)动态代理类的特点:JVM生成的动态类必须实现一个或多个接口

友情提示:如果要为一个没有实现接口的类生成动态代理类,那么可以使用CGLIB库(CGLIB库可以动态生成一个类的子类,一个类的子类也可以用作该 类的代理)。

2JVM动态生成的类

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方法返回的对象。

2BeanFactory的构造方法接收代表配置文件的输入流对象,配置文件格式如下:

       #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

友情提示:StringBuildStringBuffer之间的区别:它们在用法上基本相同,都是动态的往字符串上添加内容,在单线程的情况下,StringBuild效率会高一点,不需要考虑安全;在多线程的情况下,要使用StringBuffer,需要考虑到线程安全

 

-----------------------android培训java培训java学习型技术博客、期待与您交流! ----------------------

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值