聪明文档网

聪明文档网

最新最全的文档下载
当前位置: 首页> Java动态代理技术-

Java动态代理技术-

时间:    下载该word文档
Java动态代理技术
现在Java的好多应用都使用动态代理,包括HibernateSpring等等都使用动态代理技术。动态代理就是在没有Java文件的情况下生成符合格式的Java字节码,再定义成类对象来使用。动态代理有两种实现方式,一种是基于接口的实现方式,另一种当然是不基于接口的实现,下面就两种方式的实现方法简单说一说。

基于接口的实现: 这种实现方式主要利用Java的反射机制,通过指定的接口动态生成实现指定接口的类来实现,需要用到java.lang.reflect.InvocationHandler接口和java.lang.reflect.Proxy类。先编写一个类实现InvocationHandler接口的invoke方法:
public class MyInvocationHandler implements InvocationHandler{ public Object invoke(Object proxy Method method Object[] args { …… } }
InvocationHandler handler = new MyInvocationHandler(...; Class proxyClass = Proxy.getProxyClass(Foo.class.getClassLoader( new Class[] { Foo.class }; Foo f = (Foo proxyClass.getConstructor(new Class[] { InvocationHandler.class }. newInstance(new Object[] { handler };
或者直接生成代理对象使用如下方法: Foo f = (Foo Proxy.newProxyInstance(Foo.class.getClassLoader( new Class[] { Foo.class } handler;
动态代理类(以下简称为代理类)是一个实现在创建类时在运行时指定的接口列表的类,该类具有下面描述的行为。 代理接口 是代理类实现的一个接口。 代理实例 是代理类的一个实例。 每个代理实例都有一个关联的调用处理程序 对象,它可以实现接口 InvocationHandler过其中一个代理接口的代理实例上的方法调用将被指派到实例的调用处理程序的 Invoke 方法,并传递代理实例、识别调用方法的 java.lang.reflect.Method 对象以及包含参数的 Object 类型的数组。调用处理程序以适当的方式处理编码的方法调用,并且它返回的结果将作为代理实例上方法调用的结果返回。


以前一直没搞明白这个代理有什么用,现在理解上去了,例如远程对象的调用就需要使用代理实现,假如在服务器端定义一个接口IA,然后写个实现类CA,部署运行环境,有个ServerSocket接口接受远程调用。客户端需要使用代理,客户端首先要能加载IA这个接口,通Proxy获得代理类,当然还是按照IA接口义方法使用这个代理类,在自定义的InvocationHandler invoke方法中可以发送客户端调用的信息,包括方法名,参数等信息,把这些信息进行编组成一定格式的数据,通过Socket发送的服务器端,当然前提是服务器端Socket能解析这部分数据,服务器端接收到这些请求,解析出其中包含的方法名和参数信息,然后根据这些信息找到相应的对象调用之,并发调用返回的结构编码返回到客户端,客户端当然也应该能解析这些返回信息,这样就实现了一个简单的远程调用,可以认识是个简单的RMI实现。

还有一个不基于接口的实现:
这个实现比较复杂,但是原理很简单,首先有个已经编写好的类,可是这里没有接口的参与,不能使用Proxy动态生成代理类,那怎么办?还好有个ClassLoader类,这个类可以用给定的字节数组创建类,呵呵,这就是实现动态代理的方法,实际上就是自己生成Java字节码。但是首先需要掌握Java class文件的结构定义,我们就按照这个结构自己定义一个类,指定被代理的类为这个新类的父类,新类再起个名,并创建和被代理类的所有public方法同名同参数的方法,在方法内实现对一些自己的逻辑也可以在这里调用父类的同名方法,这就实现了不急于接口的动态代理方式。现在有很多类库都是实现对class文件内容的编辑,其中最有名的是ASM软件包,因为体积小,运行速度快而受欢迎,另外Apache也开发的相应的软件包。

免费下载 Word文档免费下载: Java动态代理技术-

  • 29.8

    ¥45 每天只需1.0元
    1个月 推荐
  • 9.9

    ¥15
    1天
  • 59.8

    ¥90
    3个月

选择支付方式

  • 微信付款
郑重提醒:支付后,系统自动为您完成注册

请使用微信扫码支付(元)

订单号:
支付后,系统自动为您完成注册
遇到问题请联系 在线客服

常用手机号:
用于找回密码
图片验证码:
看不清?点击更换
短信验证码:
新密码:
 
绑定后可用手机号登录
请不要关闭本页面,支付完成后请点击【支付完成】按钮
遇到问题请联系 在线客服