关于动态代理模式

来源:互联网 发布:腾讯代理绝地求生知乎 编辑:程序博客网 时间:2024/06/03 13:38

1.动态代理嵌套, 其含义就是将代理对象变为被代理对象

//代理接口声明

public interface Sanc {
public void print();
}

//被代理对象 Sanc1 

public class Sanc1 implements Sanc{

public void print(){
System.out.println("sanc1");
}


}

//代理对象DySanc2   ,代理Sanc1

public class DySanc2 implements InvocationHandler{

private Object sub;

public DySanc2(){

    }
 
    public DySanc2(Object obj){
   
        sub = obj;
        
    }

@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
tell();
System.out.println(method);
method.invoke(sub, args); 
System.out.println("after calling " + method);
return null;
}

public void tell(){
System.out.println("动态代理:我是lao2");
}


}

//代理对象DySanc3 ,代理DySanc2 

public class DySanc3 implements InvocationHandler{

private Object sub;

public DySanc3(){

    }
 
    public DySanc3(Object obj){
   
        sub = obj;
        
    }

@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
tell();
System.out.println(method);
method.invoke(sub, args); 
System.out.println("after calling " + method);
return null;
}

public void tell(){

System.out.println("动态代理嵌套:我是老3");

}

}

//测试用例

public class Test {
public static  void main(String[] args) throws Throwable{

   Sanc sc1 = new Sanc1();

           InvocationHandler sc2 = new DySanc2(sc1);

InvocationHandler sc3 = new DySanc3(sc2);          
           Class<?> cls2 = sc2.getClass();                     
         
            //此处重点 ,将代理对象DySanc2,声明为DySanc3的被代理对象。
           InvocationHandler dysc2 = (InvocationHandler) Proxy.newProxyInstance(
           cls2.getClassLoader(), cls2.getInterfaces(), sc3);

           Class<?> cls = sc1.getClass();


           //将上一处生成的DySanc2代理对象,作为Sanc1的代理类。
           Sanc dysc1 = (Sanc) Proxy.newProxyInstance(
           cls.getClassLoader(), cls.getInterfaces(), dysc2);
  

                         // 嵌套第二层代理,只是代理InvocationHandler  这部分,不然无法回调sanc1的方法.     

                         //发觉还是直接运行一下比较好理解。说了一堆废话                  
           dysc1.print();
       
    }
}

2.传统代理,直接上列子


public class Client {
public static  void main(String[] args) throws Throwable{
//创建真实类的一个对象
            RealSubject rs = new RealSubject();
//得到代理器实例
            InvocationHandler ds = new DynamicSubject(rs);
            Class<?> cls = rs.getClass();
            //cls.getClassLoader():定义代理类的类加载器
            //cls.getInterfaces()代理类要实现的接口列表,但代理实例化好以后,就宣称他实现了这些接口
            //ds:代理处理器,此时invoke方法还没执行
            //返回一个有代理有代理处理器代理实例,就是所创造的去要原子弹的代理人
            Subject subject = (Subject) Proxy.newProxyInstance(
            cls.getClassLoader(), cls.getInterfaces(), ds);
            System.out.println(subject.getClass());
         /  subject.response("june");
       
     }
}
 

DynamicSubject ;java

public class DynamicSubject implements InvocationHandler{

private Object sub;

public DynamicSubject(){

    }
 
    public DynamicSubject(Object obj){
   
        sub = obj;
        
    }

@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("before calling " + method);
//注意!!!调用sub对象的method方法,传的参数是args
System.out.println(method);
method.invoke(sub, args);
 
System.out.println("after calling " + method);
return null;
}


public Object getSub() {
return sub;
}


public void setSub(Object sub) {
this.sub = sub;
}

}

public class RealSubject implements Subject{


@Override
public void request() {
// TODO Auto-generated method stub
System.out.println("From real subject.request");
}


@Override
public void response(String str) {
// TODO Auto-generated method stub
System.out.println("From real subject.response"+str);
}

}


public interface Subject {
public void request();
 
public void response(String str);
}


3.第二种  使用一个空接口,真实代理却是其他对象

public interface Mapper {

public void execute();


}

public class DynamicMapper implements InvocationHandler{

private Object obj;


public DynamicMapper(Object obj){
this.obj = obj;
}


@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
String content =   (String) ((HashMap) obj).get("execute");
System.out.println(content);

System.out.println(method);

return null;
}


public Object getObj() {
return obj;
}


public void setObj(Object obj) {
this.obj = obj;
}

}


public class DemoTest {


public static void main(String[] args) {
Map map =  new HashMap();
map.put("execute", " execute some content");

DynamicMapper ds =  new DynamicMapper(map);
Mapper mapper = (Mapper) Proxy.newProxyInstance(
Mapper.class.getClassLoader(),new Class[]{Mapper.class}, ds);
mapper.execute();

           



}


}

 




0 0