|---定义:代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式的思想是为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象。这些额外的操作通常需要与实际对象进行通信。
|---动态代理类:要为系统中的各种接口的类增加代理功能,那将需要太多的代理类,全部采用静态代理方式,将是一件非常麻烦的事情!写成
百上千个代理类,是不是太累!JVM可以在运行期动态生成出类的字节码,这种动态生成的类往往被用作代理类,即动态代理类,动态类往往要实现一个
或多个接口,当目标类没有实现接口时,想得到动态代理类就需要使用CGLIB库,可以动态生成一个类的子类,一个类的子类也可以用作该类的代理,所
以,如果要为一个没有实现接口的类生成动态代理类,那么可以使用CGLIB库
|---加系统功能的位子:
1.在调用目标方法之前
2.在调用目标方法之后
3.在调用目标方法前后
4.在处理目标方法异常的catch块中
|---动态代理的三种创建方式(老师叫我把三种方式的代码大致口述一遍)(自己写一遍吧)
1,Proxy.getProxyClass(类加载器,接口)获取字节码文件,在根据字节码获取构造函数,Proxy只有一个带参的构造函数参数位
InvocationHandler的对象,通过反射获取,在newInstance获取对象;
2,使用匿名内部类:new InvocationHandler(){}
3, Proxy.newProxyInstance方法
10,类加载器:
类加载器负责加载 Java 类的字节代码到 Java 虚拟机中。Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码
(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例。基本上所有的类加载器都是 java.lang.ClassLoader类
的一个实例。
<1> 加载的三个步骤:1,装载:查找和导入class文件。
2,链接:其中解析步骤是可以选择的
(a)检查:检查载入的class文件数据的正确性
(b)准备:给类的静态变量分配存储空间
(c)解析:将符号引用转成直接引用
3,初始化:对静态变量,静态代码块执行初始化工作
<2> ExtClassLoader是ClassLoder的子类,负责装载JRE扩展目录ext下的jar类包
<3> AppClassLoader负责装载classpath路径下的类包,这三个类装载器存在父子层级关系,即根装载器是ExtClassLoader的父装载器,ExtClassLoader
是AppClassLoader的父装载器。默认情况下使用AppClassLoader装载应用程序的类
<4>,Java装载类使用“全盘负责委托机制”。“全盘负责”是指当一个ClassLoder装载一个类时,除非显示的使用另外一个ClassLoder,该类所依赖及
引用的类也由这个ClassLoder载入;“委托机制”是指先委托父类装载器寻找目标类,只有在找不到的情况下才从自己的类路径中查找并装载目标类。这一点
是从安全方面考虑的,试想如果一个人写了一个恶意的基础类(如java.lang.String)并加载到JVM将会引起严重的后果,但有了全盘负责制,java.lang.
String永远是由根装载器来装载,避免以上情况发生 除了JVM默认的三个ClassLoder以外,第三方可以编写自己的类装载器,以实现一些特殊的需求。类文
件被装载解析后,在JVM中都有一个对应的java.lang.Class对象,提供了类结构信息的描述。数组,枚举及基本数据类型,甚至void都拥有对应的Class对象。
|
|