动态代理
    可以理解为一个代工厂
    什么品牌都代工 有好多生产线 除了卖苹果手机之外还能卖别的品牌的手机
    由于这个对象什么都能做 所以动态代理代理的就不是对象了 而是代理原来对象该做的事情(即方法)
    Java已经给我们提供了 Proxy类 可以帮我们创建一个代理对象(这个对象就是动态代理的对象 什么都能做)
    动态代理 代理方法(接口/功能)

    商店接口:

    1. public interface Store {
    2. public iPhone selliPhone();
    3. }

    苹果商店:

    1. public interface AppleStore extends Store{
    2. //苹果的招牌留着 不做事了
    3. public iPhone selliPhone();
    4. }

    iPhone手机:

    1. public class iPhone{
    2. private String name;
    3. private String color;
    4. public iPhone(){}
    5. public iPhone(String name,String color){
    6. this.name = name;
    7. this.color = color;
    8. }
    9. public String getName() {
    10. return name;
    11. }
    12. public String getColor() {
    13. return color;
    14. }
    15. public void setName(String name) {
    16. this.name = name;
    17. }
    18. public void setColor(String color) {
    19. this.color = color;
    20. }
    21. public void call() {
    22. System.out.println("真的iPhone手机 打电话很流畅");
    23. }
    24. public void play() {
    25. System.out.println("真的iPhone手机 玩游戏不卡顿");
    26. }
    27. public void photo() {
    28. System.out.println("真的iPhone手机 拍照片很清晰");
    29. }
    30. }

    代工厂:

    1. public class ProxyFactory {
    2. //代工厂
    3. //有个方法 通过Proxy这个类获取一个代理对象(代工商店)
    4. // 参数----> 代理谁
    5. // 返回值---> 代理对象(因为不知道代理谁 所以用泛型来代替)
    6. public static <T>T getStore(Class clazz){
    7. //创建proxy代理对象前 需要三个参数
    8. //0 类加载器---因为传递的是clazz这个类 所以需要把这个类加载进来
    9. // 比如把代理的AppleStore这个类加载进来
    10. ClassLoader loader = clazz.getClassLoader();
    11. //1 代理谁(比如代理苹果店AppleStore 即传递进来的参数clazz)
    12. Class[] classes = new Class[]{clazz};
    13. //2 代理之后 具体该做什么事情(这里是卖手机)
    14. InvocationHandler handler = new InvocationHandler() {
    15. //这个invoke方法相当于是代理对象的真正执行方法
    16. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    17. //proxy就是代理对象
    18. //method就是代理对象代替真实对象原来该做的方法
    19. //args为代理对象接收到真实对象的参数 相当于执行方法所需参数
    20. return null;
    21. }
    22. };
    23. //1 通过Proxy类帮我们创建一个代理对象
    24. T proxy = (T) Proxy.newProxyInstance(loader,classes,handler);
    25. //2 将proxy代理对象返回
    26. return proxy;
    27. }
    28. }

    用户:

    1. public static void main(String[] args){
    2. //有一个代工厂 什么品牌都能卖
    3. //比如这里代理苹果店
    4. Store store = ProxyFactory.getStore(AppleStore.class);
    5. iPhone p = store.selliPhone();
    6. p.call();
    7. p.play();
    8. p.photo();
    9. //有两个问题
    10. //1 如果有一个代工厂做事情 那么真正的AppleStore还需要么?
    11. // 可以不需要了 招牌留着 具体不做事
    12. //2 如果苹果店不做事 那么是不是应该代工店做事情?
    13. }