Java Proxy动态代理浅析

首先我们需要举栗说明Proxy动态代理类的实际用途:
例如:现在有一位火车乘客,一位黄牛,一座火车站,乘客想要完成买票的动作,他可以到火车站去买,也可以在黄牛手中完成购买火车票的操作,他从黄牛手中买到的票,与火车站买到的票效果相同,这个时候就可以说黄牛是火车站的代理类,黄牛能够间接的调用火车站的功能,同时也能够在卖黄牛票前后插入其他逻辑(比如打广告)来完成切面编程。
动态代理的流程图如下:
这里写图片描述

例如上图中:
创建一个Server 接口,以及它的业务实现类ServiceImpl(火车站类,GetTicket(args)买票功能实现)及对象ServiceImplObj(火车站对象)。
我们想要得到代理对象,必须要有代理类,本文只是浅析,不做深层源码研究,只需要知道此类是由反射机制自动生成,会实现相应的业务接口即可。
我们需要创建一个MyHandler对象来处理 代理对象即将被调用的某些方法(例如GetTicket)。类似于,AOP中进行函数调用前后插入相关逻辑的地方。
—————————————————-

MyHandler类中的构造方法会需要传入一个Object,这个Obj就是业务实现对象,代理对象的构造方法中需要传入Handler对象,由此我们可以猜想:

代理对象,handler和业务实现类对象ServiceImplObj存在一个互相绑定的关系,在用户调用代理对象的GetTicket方法时,会调用已绑定的Handler的Invoke方法同时传入参数method(用户调用的方法名),args(调用此方法所需的参数)。然后Handler对象由于已经绑定了ServiceImplObj所以会直接执行其中的对应方法,并返回结果!

一次完整的调用过程大概就是这样,接下来附上示例源码:

Service.java

public interface Service {
    public void getTicket(String s);
}
ServiceImpl.java


public class ServiceImpl implements Service {

    @Override
    public void getTicket(String s) {
        // TODO Auto-generated method stub
        System.out.println("get ticket:"+s);
    }

}

MyHandler.java


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

public class MyHandler implements InvocationHandler{
    private Object target=null;

    public MyHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object obj, Method method, Object[] args) throws Throwable {
        System.out.println("you can insert something before invoke the method");
        Object result=method.invoke(target, args);
        System.out.println("you can insert something after   invoke the method");
        return result;
    }

}
import java.lang.reflect.Proxy;

public class ProxyTest {

    public static void main(String[] args){
        ServiceImpl sp = new ServiceImpl();
        MyHandler mh = new MyHandler(sp);
        Service s = (Service)Proxy.newProxyInstance(sp.getClass().getClassLoader(),sp.getClass().getInterfaces(), mh);
        s.getTicket("4:00am");
    }
}

自此,一个简单的动态代理Demo就完成啦!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值