基于接口的动态代理

来源:互联网 发布:java this.getclass 编辑:程序博客网 时间:2024/05/16 15:27
动态代理:
      基于接口的动态代理
       java.lang.reflect.Proxy
        static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) 
        作用:返回代理类的实例
        参数:
                   loader:类加载器,一般与被代理对象使用同一个
                   interfaces:被代理对象所实现的接口
                   h:怎么代理
                 
       Object invoke(Object proxy, Method method, Object[] args) :调用原有类的任何方法,都会经过此方法。
       
       
       
       
       例:
       *******************************************************************************************************
       public interface Human {
              void sing(float money);
              void dance(float money);
        }
       *******************************************************************************************************
       public class Chun implements Human{
              @Override
              public void sing(float money) {
                      System.out.println("拿到钱:"+money+"开唱");
              }
              @Override
              public void dance(float money) {
                      System.out.println("拿到钱:"+money+"开跳");
              }
        }
       *******************************************************************************************************
       public class Client {
          public static void main(String[] args) {
                  final Chun c = new Chun();
                  
                  // 找到春的动态代理类(经纪人)
                  Human h = (Human)Proxy.newProxyInstance(Chun.class.getClassLoader(), 
                                                      c.getClass().getInterfaces(), new InvocationHandler(){            
                          @Override // 拦截 proxy: 代理对象的引用   method:当前调用的方法  args:当前方法需要的参数
                          public Object invoke(Object proxy, Method method, Object[] args)
                              throws Throwable {
                                  // 跳舞出场费不能少于30000
                                  if("dance".equals(method.getName())){
                                          float money = (Float)args[0];
                                          if(money>30000){
                                                  c.dance(money/2);
                                          }
                                  }
                                  // 唱歌出场费不能少于20000
                                  if("sing".equals(method.getName())){
                                          float money = (Float)args[0];
                                          if(money>20000){
                                                  c.sing(money/2);
                                          }
                                  }
                                  return null;
                                }
                        });
                  h.sing(40000);
                  h.dance(60000);
           }
        }
       *******************************************************************************************************
       
       
       
0 0
原创粉丝点击