静态代理和动态代理

public interface Human {
void sing(float money);
void dance(float money);
}

public class SpringBrother implements Human  {  //这是要被代理的类

 public void sing(float money) {
System.out.println(“拿到钱:”+money+”开始唱”);
}

 public void dance(float money) {
System.out.println(“拿到钱:”+money+”开始跳”);
}

}

//经纪人:代理人,完成真正的操作之前做了很多事,如下:
//静态代理
public class ProxyMan implements Human {
private Human h ;
public ProxyMan(Human h){
this.h = h;
}
@Override
public void sing(float money) {
if(money<10000)
throw new RuntimeException(“出场费不能少于10000”);
money=money/2;
h.sing(money);
}

 @Override
public void dance(float money) {
if(money<20000)
throw new RuntimeException(“出场费不能少于20000”);
money=money/2;
h.dance(money);
}

}

测试:

public static void main(String[] args) {
Human h = new ProxyMan(new SpringBrother());
h.sing(100000);
h.dance(200000);

以上就是静态代理,很麻烦,要代理人手动加入很多代码。

动态代理,其实就是要实现一个方法InvocationHandler(),完成具体的操作,内部类的实现方式,会拦截调用只要human接口的方法,都会被拦截,都会执行InvocationHandler() 方法,如下:

其他代码不变。

[java]

  1. //动态代理:在内存中生成代理类或代理类的实例  
  2.         final Human h = new SpringBrother();//原有对象  
  3.         /* 
  4.          * newProxyInstance(loader, interfaces, h) 
  5.          * loader:代理类使用的类加载器。与被代理对象使用的相同 
  6.          * interfaces:代理类实现与被代理类相同的接口。目的,拥有相同的行为 
  7.          * h:如何代理?编码指定具体的代理方案(策略设计模式) 
  8.          */  
  9.         Human pMan = (Human)Proxy.newProxyInstance(h.getClass().getClassLoader(), h.getClass().getInterfaces(), new InvocationHandler() {  
  10.             //调用原有类的任何方法都会经过该方法  
  11.               
  12.             /* 
  13.              * proxy:代理对象本身的引用 
  14.              * method:当前执行的那个方法 
  15.              * args:当前方法需要的参数 
  16.              * 返回值:当前方法返回的值 
  17.              */  
  18.             public Object invoke(Object proxy, Method method, Object[] args)  
  19.                     throws Throwable {  
  20.                 String methodName = method.getName();// sing  dance  
  21.                 if(“sing”.equals(methodName)){  
  22.                     float money = (Float)args[0];  
  23.                     if(money<10000)  
  24.                         throw new RuntimeException(“出场费不能少于10000”);  
  25.                     money=money/2;  
  26.                     return method.invoke(h, money);  
  27.                 }else if(“dance”.equals(methodName)){  
  28.                     float money = (Float)args[0];  
  29.                     if(money<20000)  
  30.                         throw new RuntimeException(“出场费不能少于20000”);  
  31.                     money=money/2;  
  32.                     return method.invoke(h, money);  
  33.                 }else  
  34.                     return method.invoke(h, args);  
  35.             }  
  36.         });  
  37.           
  38.           
  39.         pMan.sing(100000);  
  40.         pMan.dance(200000);  
  41.     }  

 

标签