1. Overview
Java在java.lang.reflect包下,定义了自己的代理。利用这个包下的类,我们可以在运行时动态地创建一个代理类,实现一个或多个接口。并将方法的调用转发到你所指定的类。因为实际代理是在运行时创建的,所以称为:动态代理。
Proxy:完全由java产生的,而且实现了完整的subject接口。
InvocationHandler:Proxy上的任何方法调用都会被传入此类,InvocationHandler控制对RealSubject的访问。
因为Java已经帮助我们创建了Proxy类,我们需要有办法告诉Proxy类你要做什么,我们不能像以前一样把代码写入到Proxy类中,因为 Proxy类不是我们实现的。那么我们应该放在哪里?放在InvocationHandler类中,InvocationHandler类是响应代理的任何调用。我们可以吧InvocationHandler想成是代理收到方法调用后,请求做实际工作的对象。
2. java.lang.reflect.InvocationHandler
被代理实例所实现的一个接口,内部只有一个invoke()方法,签名如下;
Java代码
public Object invoke(Object proxy, Method method, Object[] args)
当代理的方法被调用的时候,代理就会把这个调用转发给InvocationHandler,也就会调用它的invoke()方法。
3. java.lang.reflect.Proxy
提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类,我们经常使用的静态方式是:
Java代码
newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)
Java代码
1.package com.jelly.dynamicproxy;
2.
3.import java.lang.reflect.InvocationHandler;
4.import java.lang.reflect.Method;
5.import java.lang.reflect.Proxy;
6.import java.util.List;
7.import java.util.Vector;
8.
9./**
10. * 动态代理
11. *
12. * @author Jelly QQ136179492
13. *
14. */
15.public class VectorProxy implements InvocationHandler {
16. private Object object;
17.
18. public VectorProxy(Object obj) {
19. this.object = obj;
20. }
21.
22. public Object invoke(Object proxy, Method method, Object[] args)
23. throws Throwable {
24. System.out.println("before calling:" + method);
25. // 当有参数的时候,打印出所有方法
26. if (null != args)
27. for (Object ob : args) {
28. System.out.println(ob);
29. }
30. Object obj = method.invoke(object, args);
31. System.out.println("after calling:" + method);
32. return obj;
33. }
34.
35. public static Object factory(Object obj) {
36. Class<?> classType = obj.getClass();
37. for (Class c : classType.getInterfaces()) {
38. System.out.println("接口" + c.getName());
39. }
40. // 返回动态代理
41. return Proxy.newProxyInstance(classType.getClassLoader(),
42. classType.getInterfaces(), new VectorProxy(obj));
43. }
44.
45. public static void main(String[] args) {
46. List v = (List) factory(new Vector());
47. System.out.println(v.getClass().getName());
48. v.add("new");
49. v.add("york");
50. }
51.}
|