1.1.1 需求:
1.1.3 代码实现:
1.1.4 总结:
1.1.4.1 代理的企业应用:
1.1.4.2 类加载器:
无论使用GET还是POST提交,到Servlet中只需要调用request.getParameter方法,中文乱码就已经处理好。
1.1.2 分析:
1.1.2.1 技术分析:
【要求中的方法的增强】
Ø继承:能够控制这个类的构造。
Ø装饰者:增强的类和被增强的类实现相同的接口,增强的类中获得到被增强的类的引用。
*接口中方法过多,只增强其中的某个方法。其他的方法也需要重写。
Ø 动态代理:被增强的类实现了接口。
【代理的概述】
Ø代理:
ØJDK中动态代理:代理对象。
* Proxy.newProxyInstance(ClassLoader cl,Class []接口,InvocationHandler ih);
【动态代理入门】:
[AppleScript的]
纯字幕:查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
@WebFilter
(
urlPatterns
=
"/*"
)
public
class
GenericEncodingFilter implements Filter
{
@Override
public void init
(
FilterConfig filterConfig
)
throws ServletException
{
}
@Override
public void doFilter
(
ServletRequest request
,
ServletResponse response
,
FilterChain chain
)
throws IOException
,
ServletException
{
final HttpServletRequest req
=
(
HttpServletRequest
)
request;
/
/
增强req
:
HttpServletRequest myReq
=
(
HttpServletRequest
)
Proxy.newProxyInstance
(
req.getClass
(
)
.getClassLoader
(
)
,
req.getClass
(
)
.getInterfaces
(
)
,
new
InvocationHandler
(
)
{
@Override
public Object invoke
(
Object proxy
,
Method method
,
Object[] args
)
throws Throwable
{
/
/
判断执行的方法是否是getParameter
:
if
(
"getParameter"
.
equals
(
method.getName
(
)
)
)
{
/
/
调用的是getParameter
:
需要增强这个方法.
/
/
判断请求方式是GET还是POST
:
String type
=
req.getMethod
(
)
;
if
(
"get"
.equalsIgnoreCase
(
type
)
)
{
String
value
=
(
String
)
method.invoke
(
req
,
args
)
;
value
=
new
String
(
value
.getBytes
(
"ISO-8859-1"
)
,
"UTF-8"
)
;
return
value
;
}
else if
(
"post"
.equalsIgnoreCase
(
type
)
)
{
req.setCharacterEncoding
(
"UTF-8"
)
;
}
}
return
method.invoke
(
req
,
args
)
;
}
}
)
;
chain.doFilter
(
myReq
,
response
)
;
}
@Override
public void destroy
(
)
{
}
}
|
【春天的AOP】
AOP的底层使用的就是代理机制:
* AOP:面向切面编程。新的思想,用来解决OOP中遇到的一些问题!
类的加载器:将类文件加载到JVM中执行这个文件。
Java的中将类加载器分成三类:
引导类加载器: JAVA_HOME/jre/lib/rt.jar
|
扩展类加载器: JAVA_HOME/jre/lib/ext/*.jar
|
应用类加载器: 加载类路径下的所有的class.
这些类加载器如何保证类只会加载一次而且不会重复加载:
类加载器的全盘委托机制:
class A {
String s;
}
由应用类加载器得到A.class String,class,委托给扩展类加载器,扩展类加载器又委托给引导类加载器.引导类加载器加载String.class.将其他的类的class向下给扩展类加载器.扩展类加载器没有找到.向下给应用类加载器,将A.class 加载.