动态代理模式的初实现

package com.it.Proxy;

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

//动态代理模式的实现
public class DynamicProxy {
    public static void main(String[] args) {
        //创建被代理类的对象
        superman superman = new superman();
        //获取代理类的对象
        Human instance = (Human) proxy.getInstance(superman);
        //代理类的对象调用其接口中重写的方法,实际是被代理类对象调用其内部的方法
        String believe = instance.getBelieve();
        instance.eat("水果");
        System.out.println(believe);

    }
}

interface   Human{
    String  getBelieve();
    void eat(String food);
}
//被代理类
class  superman   implements  Human{

    @Override
    public String getBelieve() {
        return "I    believe    I  can  fly! ";
    }

    @Override
    public void eat(String food) {
        System.out.println("我喜欢吃"+food);
    }
}
//动态代理类
class   proxy{


    public static Object   getInstance(Object obj){
        //创建InvocationHandler接口实现类的对象
        MyInvocationHandler handler = new MyInvocationHandler();
        //调用bind绑定方法将被代理类的对象作为实参传递过去
        handler.bind(obj);
        //通过调用Proxy类中的newProxyInstance静态方法,传入被代理类,以及接口,以及调用处理器接口的实现类对象,
        //从而创建一个与被代理类,同加载器,同接口的代理类对象,而调用处理器接口使得在代理类对象调用其重写的方法时,实际
        //调用的是被代理类中的方法,从而达到动态代理模式的效果
        Object o = Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(),
                handler);
return o;
    }



    static class  MyInvocationHandler  implements java.lang.reflect.InvocationHandler {
        //提供一个Objcet类型的对象变量,使得任意对象都可以作为参数
           private   Object    obj;
    //通过bind方法,给被代理类对象初始化
        public  void bind(Object obj){
             this.obj =obj;
        }



        @Override
        //通过重写接口中的invoke方法,使得代理类对象在调用a方法时,会自动调用invoke方法,使被代理类对象调用a方法
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            //有返回值的话该方法可以直接将返回值返回,代理类对象调用方法处直接接收即可
            Object returnvalue = method.invoke(obj,args);
         
            return returnvalue;
        }
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值