JDK动态代理,接口代理

 在了解jdk代理之前,我们要知道什么是动态代理?动态代理可以干什么呢?

  在现实生活中有很多代理对象(如明星代理),可以实现真实对象的功能,还在真实对象的基础上添加了新的功能,保证真实对象没有被修改。而jdk动态代理就和这个实现原理大概一致。

简介:

  1. 需要存在抽象对象,定义所有的功能

  2. 真实对象实现抽象对象所有的功能

  3. 通过Proxy类,创建代理对象,调用代理方法

  4. 在InvocationHandler的invoke对代理的方法有选择的修改或不修改真实对象原有的方法。

抽象角色

package com.it.proxy;
​
/**
 抽象角色:定义功能
 */
public interface Star {
​
    /**
     唱歌
     @param song
     */
    void sing(String song);
​
    /**
     演出
     @param money
     */
    void act(int money);
}
 

真实角色

明星只负责唱歌、拍戏。

package com.it.proxy;
​
/**
 真实角色
 */
public class SuperStar implements Star {
    @Override
    public void sing(String song) {
        System.out.println("明星唱:" + song);
    }
​
    @Override
    public void act(int money) {
        System.out.println("明星拍戏出场费:" + money);
    }
}

jdk动态代理角色

代理帮助明星收费,查看钱满不满足明星的要求。

package com.it.proxy;


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Fans {

public static void main(String[] args) {
  /*
  使用JDK动态代理,创建代理对象
  参数1:类加载器
  参数2:所有实现的接口
  参数3:方法调用的接口,Star接口中每个方法都会调用一次
  */
  Star s2 = (Star) Proxy.newProxyInstance(
    s1.getClass().getClassLoader(),
    new Class[]{Star.class},
  new InvocationHandler() {
/*
对每个方法进行功能增强
参数1:代理对象,不能直接调用,不然出现递归
参数2:每个方法对象,如:sing() act(),每个方法都会调用一次
参数3:方法传递的参数,如:歌名
返回值:调用的方法的返回值
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  //如果是演出的方法,判断是否小于1000,如果小于则不演出,否则调用原来的方法
  String methodName = method.getName();
  if ("act".equals(methodName)) {
  //得到演示参数值
  int money = (int) args[0];
  if (money < 1000) {
    System.out.println("费用太低,不演出了");
  return null;
  }
}
  //其它的情况就调用真实对象原来的方法
  return method.invoke(s1, args); //真实对象,方法的参数
  }
});

  //fans请自己喜欢的明星出场唱歌,拍戏   s2.sing(
"只因你太美");
  //费用过低不满足   s2.act(
500);   } }

猜你喜欢

转载自www.cnblogs.com/622-yzl/p/11002899.html
今日推荐