java从入门到放弃(二)代理

一、概念

  代理,顾名思义,代你处理的意思。代理分为静态代理和动态代理,静态代理是在编译时就将接口、实现类、代理类一股脑儿全部手动完成,但如果我们需要很多的代理,每一个都这么手动的去创建实属浪费时间,而且会有大量的重复代码,此时我们就可以采用动态代理。动态代理可以在程序运行期间根据需要动态的创建代理类及其实例,来完成具体的功能。

二、静态代理

  静态代理是非常简单的模式了,可以通过如下代码先简单了解下。
先建立一个博主接口,告诉外界博主是可以做事的。

public interface Ranen {
    public void canDo();
}

再来个实现,写一下自己可以做的事儿有哪些。

public class RanenImpl implements Ranen {
    @Override public void canDo() {
            System.out.println("我会写JAVA");
            System.out.println("我会python");
            System.out.println("我会c");
            System.out.println("我会c#");
            System.out.println("我会c++");
            return;
    }
}

接下来生成一个组长代理类,类需重写被代理的博主的canDo接口。

public class LeaderProxy implements Ranen{
	Ranen ranen;
	Unit(Ranen ranen){
	this.ranen = ranen;
	}
	 @Override public void canDo() {
         ranen.canDo();
         // 组长需要做的事情
         return;
    }
}

接下来生成一个客户来要人。

public class Customer {
    public static void main(String args[]){
        //定义一个博主
        Ranen ranen = new Ranen();
        //再来一个领导
        Ranen proxy = new LeaderProxy(coder);
        //让领导说能做点啥
        proxy.canDo();
    }
}

三、JDK动态代理

  作一个简单的比喻,假如你是明星,你有一个经纪人。有一天有一个公司来找你说让你去跨年演出,而你这个时候不知道演出前的合同等流程是怎么签署的,这个时候就用到了代理,也就是他们只需要找到你的经纪人(代理类)来处理就行了,前面的事情他会给你做好,等到演出的时候他唤你出来唱首歌就可以了。
  当然代理有好处也有坏处,好处就是可以在你演出的前后都由经纪人给你安排妥当,但是坏处就是会有效率上的损失,因为就他呼唤你出来这个操作也是需要占用资源的。
  废话不多说,直接上代码。

继承InvocationHandler接口实现自己的调用处理程序。

public class RanenInvocationHandler implements InvocationHandler {
    Object object =new Object();
   public RanenInvocationHandler(Object o){
       object = o;
    }
    @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("代理类方法开始");
        Object o = method.invoke(object);
        System.out.println("代理类方法结束");
        return o;
    }
}

测试主方法如下:

public class PeopleProxy {
    public static void main(String[] args) {
    // 直接调用
        Ranen ranen = new RanenImpl();
        ranen.canDo();
        InvocationHandler invocationHandler = new RanenInvocationHandler(ranen);
        Ranen ranen1 =((Ranen) Proxy.newProxyInstance(RanenImpl.class.getClassLoader(),
               RanenImpl.class.getInterfaces(),invocationHandler));
    // 代理调用
        ranen1.canDo();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值