动态代理、类加载器简述

来源:互联网 发布:淘宝介入买家都能赢吗 编辑:程序博客网 时间:2024/05/16 08:12

目标:   动态代理解决中文乱码问题

方式1:装饰者模式解决中文乱码

自定义类继承HttpServletRequestWrapper,只重写getParameter(String str)方法,然后再过滤器中使用 自定义类包装request对象即可。

方式2:动态代理解决中文乱码

如果只对某个方法进行增强,使用动态代理非常灵活。

 

动态代理:   

动态代理对象介绍:

Proxy提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。

核心方法: Object  static   newProxyInstance(ClassLoader loader,Class[] interfaces, InvocationHandler h)   这三个参数都是固定写法

参数一:通过被增强对象获取类加载器(应用类加载器)

参数二:通过被增强对象获取所有实现类的接口

参数三:动态代理的处理类,用于对方法的增强,此时使用匿名内部类

 

动态代理操作步骤:

1、创建被增强对象

2、创建增强后的对象

2.1、通过被代理对象获取类加载器---xxx.getClass().getClassLoader()

2.2、通过被代理对象获取其所有接口---xxx.getClass().getinterfaces()

2.3、创建一个处理类(专门用来增强方法)

实现动态代理,根本不知道它的实现类

图666666

 

 

类加载器:

类加载器:类加载器是负责加载类的对象。将class文件(硬盘)加载到内存生成class对象。

所有的类加载器都是java.lang.ClassLoader的子类

 

引导类加载器:BootStrapClassLoader C、C++

它加载的是Java\jdk1.7.0_72\jre\lib\rt.jar 

扩展类加载器:ExtClassLoader

它加载的是Java\jdk1.7.0_72\jre\lib\ext\*.jar extension

 

应用类加载器:AppClassLoader

它加载的是程序员编写的类

 

使用:类.class.getClassLoader() 获取自己的类加载器

 

类加载器加载机制:全盘负责委托机制

全盘负责:A类如果要使用B类(不存在),A类加载器C必须负责加载B类

委托机制:A类加载器如果要加载资源B,必须询问父类加载器是否加载

如果加载,将直接使用;如果没有机制,自己再加载。

 

采用全盘负责委托机制保证一个class文件只会被加载一次,生成一个Class对象。

全盘委托机制:

1、应用类加载器:加载所有的class文件,但是不将其生成对应Class对象,而是委托给扩展类加载器;

2、扩展类加载器:加载所有的class文件,但是不将其生成对应Class对象,而是委托给引导类加载器;

3、引导类加载器:加载所有的class文件,只将自己负责的class文件(rt.jar)生成对应的Class对象,将其他 的class文件转交给扩展类加载;

4、扩展类加载器:只将自己负责的class文件(ext目录下的jar)生成对应的Class对象,将其他的class文件转 交给应用类加载;

5、应用类加载器:负责将剩余的class文件生成对应的Class对象。

 

 

 

 

 

待续……

0 0
原创粉丝点击