栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JAVA代理模式-JDK动态代理的实现(二)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JAVA代理模式-JDK动态代理的实现(二)

JAVA代理模式-JDK动态代理的实现(二)
    • JDK动态代理的实现:
      • 1. 编写电影院售票的接口。
      • 2. 编写真实主题类,宁波电影院实现电影院接口,实现真正的售票动作。
      • 4. 编写代理工厂类,通过Java中提供的一个动态代理类Proxy,动态生成代理类。
      • 6. 客户调用代理类,从中介手中买票。
      • 动态代理使用时的细节:
    • JDK动态代理完整代码:

代理模式的简介可查看此链接。
JAVA代理模式-静态代理的实现(一)

JDK动态代理的实现:

Java中提供了一个动态代理类Proxy,提供了一个创建代理对象的静态方法
(newProxyInstance方法)来获取代理对象。

考虑以下场景,你需要去中介手里买电影票,中介会在售票的基础上增强手续费。
则电影院为真实主题类,而中介则为代理类,在真实主题类售卖电影票的基础上,增强功能收取了一定的手续费。

1. 编写电影院售票的接口。
interface Cinema{
    void sell();
}
2. 编写真实主题类,宁波电影院实现电影院接口,实现真正的售票动作。
class NbCinema implements Cinema{

    @Override
    public void sell() {
        System.out.println("出售电影票");
    }
}
4. 编写代理工厂类,通过Java中提供的一个动态代理类Proxy,动态生成代理类。
class CinemaProxyFactory {
    private NbCinema nc = new NbCinema();

    public Cinema getProxyObject(){
        
        
        Cinema obj = (Cinema) Proxy.newProxyInstance(
                nc.getClass().getClassLoader(),
                nc.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("收取500中介费");
                        Object invoke = method.invoke(nc, args);
                        return invoke;
                    }
                }
        );
        return obj;
    }
}
6. 客户调用代理类,从中介手中买票。
public class JDKProxyClient {
    public static void main(String[] args) {
        CinemaProxyFactory pf = new CinemaProxyFactory();
        Cinema ca =  pf.getProxyObject();
        ca.sell();
    }
}

实验结果:

动态代理使用时的细节:

因为其中使用了反射机制,如果想要更深入了解,可以参考:
JAVA通过反射使用公共构造方法和私有构造方法来创建对象(一)
JAVA通过反射获取公共和私有成员变量和成员方法(二)

JDK动态代理完整代码:
package com.csdn.proxy.JDKproxy;

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

interface Cinema{
    void sell();
}

class NbCinema implements Cinema{

    @Override
    public void sell() {
        System.out.println("出售电影票");
    }
}

class CinemaProxyFactory {
    private NbCinema nc = new NbCinema();

    public Cinema getProxyObject(){
        
        
        Cinema obj = (Cinema) Proxy.newProxyInstance(
                nc.getClass().getClassLoader(),
                nc.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("收取500中介费");
                        Object invoke = method.invoke(nc, args);
                        return invoke;
                    }
                }
        );
        return obj;
    }
}

public class JDKProxyClient {
    public static void main(String[] args) {
        CinemaProxyFactory pf = new CinemaProxyFactory();
        Cinema ca =  pf.getProxyObject();
        ca.sell();
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/845037.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号