Java基础 -> 静态,动态代理模式(反射),设计模式

静态的代理

ProxyInterface接口

/**
 * 自定义一个ProxyInterface接口,里面定义一个ProxyInterfaceMethod方法
 */
interface ProxyInterface {
    void ProxyInterfaceMethod();
}

被代理类


/**
 * Star明星类实现代理接口,重写了ProxyInterface接口方法
 */
class Star implements ProxyInterface {
    public Star() {
    }

    /**
     * 重写了代理接口方法
     */
    @Override
    public void ProxyInterfaceMethod() {
        System.out.println("明星接到通知开始做某些事");
    }
}


代理类

/**
 * StarAgent类实现ProxyInterface接口
 * 1.重写了ProxyInterface接口方法,且ProxyInterfaceMethod方法调用了Star类的重写的方法,完成代理功能
 * 2.定义了一个实例化Star类的构造器
 */
class StarAgent implements ProxyInterface {
    private ProxyInterface star;

    /**
     * 一个实例化Star明星类的构造器
     */
    public StarAgent(ProxyInterface star) {
        this.star = new Star();
    }

    public StarAgent() {
        super();
    }

    /**
     * 重写了ProxyInterface接口方法, 且方法内调用了Star类的重写的方法,完成代理功能
     */
    @Override
    public void ProxyInterfaceMethod() {
        System.out.println("经纪人准备叫明星做某些事");
        // 叫明星做一些事
        star.ProxyInterfaceMethod();
        System.out.println("经纪人看着明星做完某些事");
    }
}

测试类

package Test10;

/**
 * @author 罗德
 * @version 1.0
 */
public class Test1004 {
    /**
     * 功能描述:
     * 1.实例化Star类和StarAgent类,且star对象传入StarAgent构造器中
     * 2.实例化的starAgent调用ProxyInterfaceMethod方法完成代理功能
     */
    public static void main(String[] args) {
        Star star = new Star();
        StarAgent starAgent = new StarAgent(star);
        starAgent.ProxyInterfaceMethod();
        /*
         *经纪人准备叫明星做某些事
         *明星接到通知开始做某些事
         *经纪人看着明星做完某些事
         */
    }
}


动态代理模式

动态创建代理类


class DynamicProxy {
    public static Object getProxy(Object obj) {
        MyInvocationHandler invocationHandler = new MyInvocationHandler();
        //将被代理类的对象传入MyInvocationHandler,在这里面调用对应方法
        invocationHandler.proxyMethod(obj);
        /**
         * 功能描述:public static Object newProxyInstance(ClassLoader loader,
         *                                       @NotNull Class<?>[] interfaces,
         *                                       @NotNull reflect.InvocationHandler h)
         * 返回将方法调用分派到指定调用处理程序的指定接口的代理实例。
         *
         * 方法参数描述:
         * loader–定义代理类的类加载器
         * interfaces–要实现的代理类的接口列表
         * h–将方法调用分派到的调用处理程序
         */
        Object newProxyInstance = Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                obj.getClass().getInterfaces(), invocationHandler);
        return newProxyInstance;
    }
}

实现InvocationHandler 接口的实现类

/**
 * 功能描述:使代理类对象调用方法会转到本类的invoke()方法;
 * public interface InvocationHandler
 * InvocationHandler是由代理实例的调用处理程序实现的接口。
 * 每个代理实例都有一个关联的调用处理程序。当在代理实例上调用一个方法时,
 * 方法调用被编码并调度到其调用处理程序的invoke方法。
 * 方法参数描述:无
 */
class MyInvocationHandler implements InvocationHandler {
    private Object object;

    /**
     * 功能描述:
     * 将被代理类对象传入MyInvocationHandler类中,
     * MyInvocationHandler类相当于代理类,使用被代理类对象去调用与代理类相同的方法
     * 方法参数描述:无
     */
    public void proxyMethod(Object object) {
        this.object = object;
    }

    public MyInvocationHandler() {
    }

    /**
     * 功能描述:
     * 1.代理调用方法会转到这个方法,方法名为method,方法参数为args,proxy为代理对象的名字,因为可能会有不同的代理
     * 2.用反射掉用本类object实例对象,参数为args的方法
     * 处理代理实例上的方法调用并返回结果。
     * 当在与之关联的代理实例上调用方法时,将在调用处理程序上调用此方法。
     * 方法参数描述: 
     * proxy–调用方法的代理实例
     * method–与在代理实例上调用的接口方法相对应的方法实例。
     * args–一个对象数组,其中包含在代理实例的方法调用中传递的参数值,如果接口方法没有参数,则为null。
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        /**
         * 功能描述:反射:调用方法(代理类对象传过来的方法)
         * public Object invoke(Object obj,Object... args)
         * 在具有指定参数的指定对象上调用此方法对象表示的基础方法。
         * 单个参数会自动展开以匹配原始形式参数,并且基本参数和引用参数都会根据需要进行方法调用转换。
         * 方法参数描述:
         * obj–从中调用基础方法的对象 
         * args–用于方法调用的参数
         */
        Object invoke = method.invoke(object, args);
        return invoke;
    }
}

被代理类和接口

/**
 * 自定义一个ProxyInterface接口,里面定义一个ProxyInterfaceMethod方法
 */
interface ProxyInterface {
    void ProxyInterfaceMethod();
}

/**
 * Star明星类实现代理接口,重写了ProxyInterface接口方法
 */
class Star implements ProxyInterface {
    public Star() {
    }

    /**
     * 重写了代理接口方法
     */
    @Override
    public void ProxyInterfaceMethod() {
        System.out.println("明星接到通知开始做某些事");
    }
}

测试类

/**
 * @author 罗德
 * @version 1.0
 */
public class Test1004 {
    /**
     * 功能描述:
     * 1.创建动态代理实例,调用代理的方法
     * 2.被代理会调用与代理实例同名的方法,完成动态代理
     * 方法参数描述:无
     */
    @Test
    public void test() {
        Star star1 = new Star();
        //创建动态代理实例,运用多态,Object中没有ProxyInterfaceMethod方法
        Object proxy1 = DynamicProxy.getProxy(star1);
        //强制转换为ProxyInterface,使用特有的ProxyInterfaceMethod()方法
        ProxyInterface proxy = (ProxyInterface) proxy1;
        //调用代理的方法
        proxy.ProxyInterfaceMethod();//明星接到通知开始做某些事
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值