自定义类加载器要继承ClassLoader
loadClass()方法去加载类
覆盖findClass()
ReturndefineClass()
类加载器高级问题分析
使用tomcat服务器
代理的概念与作用:
l 编写一个与目标类具有相同接口的代理类,代理类的每个方法调用目标类的相同方法,并在调用方法时加上系统功能的代码。
l 如果采用工厂模式和配置文件的方式进行管理,则不需要修改客户端程序,在配置文件中配置是使用目标类,还是代理类,这样以后很容易切换,如:想要日志功能时就配置代理类,否则配置目标类,这样,增加系统功能很容易,以后运行一段时间后,又想去掉系统功能也很容易
AOP面向方面的编程
目标就是使交叉业务模块化
交叉业务:一个交叉业务就是要切入到系统中的一个方面,如:日志,事物在系统中的许多地方都会用到
动态代理技术:
JVM可以在运行期动态生成出类的字节码,这种动态生成的类往往被用作代理类,即动态代理类。
JVM生成的动态类必须实现一个或多个接口,所以,JVM生成的动态类只能作用具有相同接口的目标类的代理
CGLIB库可以动态生成一个类的子类,一个类的子类也可以作用该类的代理,所以,如果要为一个没有实现接口的类生成动态代理类,那么可以使用CGLIB库
代理类的各个方法中通常除了要调用目标的相应方法和对外返回目标返回的结果外,还可以在代理方法中的如下四个位置加上系统功能代码:
1. 在调用目标方法之前
2. 在调用目标方法之后
3. 在调用目标方法前后
4. 在处理目标方法异常的catch块中
动态创建类的方法:
方法一:
1. 取得代理类字节码
2. 获取代理类构造器
3. 创建代理类实例对象
源代码:
方法二:
问题:
构造方法接受一个InvocationHandler对象,接受对象要干什么呢?该方法内部的代码是怎么样的呢?
每次调用代理的方法时,都会调用InvocationHandler对象的invoke()方法
动态代理的工作原理图:
使用代理:将方法提取出来形成一个接口,定义类继承接口并实现接口中的方法,将该操作类作为参数传给代理
实现AOP功能的封装与配置:
工厂类BeanFactory
ProxyFactoryBean.java
AopFrameworkTest.java