失效链接处理 |
Java代理模式 PDF 下载
本站整理下载:
相关截图:
主要内容:
1.代理模式
代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式一般涉及到三个角色:
抽象角色:声明真实对象和代理对象的共同接口;
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
为了保持行为的一致性,代理类和委托类通常会实现相同的接口,所以在访问者看来两者没有丝毫的区别。通过代理类这中间一层,能有效控制对委托类对象的直接访问,也可以很好地隐藏和保护委托类对象,同时也为实施不同控制策略预留了空间,从而在设计上获得了更大的灵活性。Java 动态代理机制以巧妙的方式近乎完美地实践了代理模式的设计理念。
2.静态代理
public interface Subject {
void operation1();
void operation2(String arg);
}
public class SubjectImpl implements Subject {
public void operation1() {
System.out.println("方法调用1");
}
public void operation2(String arg) {
System.out.println("方法调用2 with args" + arg);
}
}
public class ProxySubject implements Subject {
private Subject srcObject; // 被代理对象
public ProxySubject(Subject srcObject) {
this.srcObject = srcObject;
}
public void operation1() {
System.out.println("Proxyer do operation1");
srcObject.operation1();
}
public void operation2(String arg) {
System.out.println("Proxyer do operation2 with " + arg);
srcObject.operation2(arg);
}
}
3.动态代理
•动态代理的本质
用来实现对目标对象进行增强,最终表现为类,只不过是动态创建子类,不用手工生成子类。
•动态代理的限制
只能在父类方法被调用之前或之后进行增强(功能的修改),不能在中间进行修改,要想在方法调用中增强,需要ASM(一个Java 字节码操作和分析框架)
1. JDK动态代理
官方,不能代理类,只能代理接口
2.CGLIB动态代理
非官方,基于ASM,能代理类和接口,不能代理final类
3.1Jdk动态代理使用
首先让我们来了解一下如何使用 Java 动态代理。具体有如下四步骤:
1.通过实现 InvocationHandler 接口创建自己的调用处理器,实现接口方法invoke;
2.通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类;
3.调用动态代理对象的接口方法
public class DynamicProxyHandler implements InvocationHandler {
// 代理模式中介绍的RealSubject对象。
private Object srcObject;
public DynamicProxyHandler(Object srcObject) {
this.srcObject = srcObject;
}
// 设计一个类用于实现InvocationHandle接口,InvocationHandler 是代理实例的调用处理程序实现的接口。
// 对应invoke参数:
// [1]study.proxy - 在其上调用方法的代理实例;
// [2]method - 对应于在代理实例上调用的接口方法的 Method 实例;
// [3]args - 包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为 null。
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("**** before method ... ****");
return method.invoke(srcObject, args);
}
}
public class DynamicProxyDemo {
public static void main(String[] args) {
Subject proxy = (Subject) Proxy.newProxyInstance(Subject.class.getClassLoader(), new Class[] { Subject.class }, new DynamicProxyHandler(real));
subject.operation1();
}
}
3.2JDK动态代理的序列图
3.3实现动态代理思路
如何实现动态代理呢?
1.动态产生Java代码和class
2.动态生成的代理类必须要继承接口A,并需要一个handler接口成员变量,该handler接口在外部由用户自己实现,实现功能的扩展。
3.代理类中的对接口A方法的调用,即调用handle.invoke接口方法即可。
3.4JDK动态代理实现-类和接口
要了解 Java 动态代理的机制,首先需要了解以下相关的类或接口:
3.4.1java.lang.reflect.Proxy
这是 Java 动态代理机制的主类,它提供了一组静态方法来为一组接口动态地生成代理类及其对象。
清单 1. Proxy 的静态方法
// 方法 1: 该方法用于获取指定代理对象所关联的调用处理器
static InvocationHandler getInvocationHandler(Object proxy)
// 方法 2:该方法用于获取关联于指定类装载器和一组接口的动态代理类的类对象
static Class getProxyClass(ClassLoader loader, Class[] interfaces)
// 方法 3:该方法用于判断指定类对象是否是一个动态代理类
static boolean isProxyClass(Class cl)
// 方法 4:该方法用于为指定类装载器、一组接口及调用处理器生成动态代理类实例
static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)
备注:interfaces 传入其他接口呢?
|