- 为其他对象提供一种代理以控制对这个对象的访问。
- 代理模式也叫做委托模式,许多其他的模式如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式。
- struts2的form元素映射就采用了动态代理模式。spring aop是非常典型的动态代理。
- GG请Proxy代替他去追MM,GG包含一个MM,Proxy包含一个GG
- Proxy的方法中执行的是GG的同名方法Proxy
- Proxy与GG具有相同的方法,抽取其共性为Same_ProxyAndGG
- 代码
public class Same_ProxyAndGG {
public void giveGiftA(){
}
public void giveGiftB(){
}
public void giveGiftC(){
}
}
public class MM {
private String name;//set get
public MM(String name) {
this.name = name;
}
}
public class GG extends Same_ProxyAndGG{
private MM mm;
public GG(MM mm){
this.mm = mm;
}
public void giveGiftA(){
System.out.println("GG送给"+mm.getName()+" GiftA");
}
public void giveGiftB(){
System.out.println("GG送给"+mm.getName()+" GiftB");
}
public void giveGiftC(){
System.out.println("GG送给"+mm.getName()+" GiftC");
}
}
public class Proxy extends Same_ProxyAndGG{
private GG gg;
public Proxy(GG gg) {
this.gg = gg;
}
public void giveGiftA(){
gg.giveGiftA();
}
public void giveGiftB(){
gg.giveGiftB();
}
public void giveGiftC(){
gg.giveGiftC();
}
}
public class Client {
public static void main(String[] args){
MM mm = new MM("漂亮妹纸");
GG gg = new GG(mm);
Proxy proxy = new Proxy(gg);
proxy.giveGiftA();
proxy.giveGiftB();
proxy.giveGiftC();
}
}
动态代理(spring aop)
- 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
- 动态代理
- 在程序运行时,运用反射机制动态创建而成。
- 动态代理是在实现阶段不用关心代理谁,在运行阶段才指定代理哪一个对象。
- aop:切面(Aspect)、切入点(JoinPoint)、通知(Advice)、织入(Weave)
java.lang.reflect包中的Proxy类和InvocationHandler接口提供了生成动态代理类的能力。
InvocationHandler接口
public interface InvocationHandler { public Object invoke(Object proxy,Method method,Object[] args) throws Throwable; } 参数说明: Object proxy:指被代理的对象。 Method method:要调用的方法 Object[] args:方法调用时所需要的参数
Proxy类:专门完成代理的操作类,可通过此类为一个或多个接口动态地生成实现类,此类提供了如下的操作方法:
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException
参数说明:
ClassLoader loader:类加载器
Class<?>[] interfaces:得到全部的接口
InvocationHandler h:得到InvocationHandler接口的子类实例
- 代码