如何实现Java语言动态代理
小标 2018-06-05 来源 : 阅读 642 评论 0

摘要:在目前的Java语言开发包中包含了对动态代理的支持,但是其实现只支持对接口的的实现。其实现主要通过是java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。希望对大家学习Java语言有所帮助。

    在目前的Java语言开发包中包含了对动态代理的支持,但是其实现只支持对接口的的实现。其实现主要通过是java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。希望对大家学习Java语言有所帮助。

    Proxy类主要用来获取动态代理对象,InvocationHandler接口用来约束调用者实现,如下,HelloWorld接口定义的业务方法,HelloWorldImpl是HelloWorld接口的实现,HelloWorldHandler是InvocationHandler接口实现。代码如下:

业务接口:

public interface HelloWorld {
       void sayHelloWorld() ;
}

   

业务接口实现:

public class HelloWorldImpl implements HelloWorld {
       public void sayHelloWorld() {
              System.out.println("Hello World!");            
       }
}

InvocationHandler实现,需要在接口方法调用前后加入一部份处理工作,这里仅仅在方法调用前后向后台输出两句字符串,其代码如下:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class HelloWorldHandler implements InvocationHandler {
       //要代理的原始对象
       private Object objOriginal;
       /**
        * 构造函数。
        * @param obj 要代理的原始对象。
        */
       public HelloWorldHandler(Object obj) {
              this.objOriginal = obj ;
       }
       public Object invoke(Object proxy, Method method, Object[] args)
                     throws Throwable {
             
              Object result ;
             
        //方法调用之前
              doBefore();
             
        //调用原始对象的方法
              result = method.invoke(this.objOriginal ,args);
             
        //方法调用之后
              doAfter();
             
              return result ;
       }
      
       private void doBefore() {
              System.out.println("before method invoke!");
       }
      
       private void doAfter() {
              System.out.println("after method invoke!");
       }
}

   

测试代码:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
 
 
 
public class Test {
 
 
 
       public static void main(String[] args) {
 
 
 
              HelloWorld hw = new HelloWorldImpl();
             
              InvocationHandler handler = new HelloWorldHandler(hw);
             
              HelloWorld proxy = (HelloWorld) Proxy.newProxyInstance(
                            hw.getClass().getClassLoader(),
                            hw.getClass().getInterfaces(),
                            handler);
              proxy.sayHelloWorld();
       }
}

   

Ø         首先获取一个业务接口的实现对象;

Ø         获取一个InvocationHandler实现,此处是HelloWorldHandler对象;

Ø         创建动态代理对象;

Ø         通过动态代理对象调用sayHelloWorld()方法,此时会在原始对象HelloWorldImpl. sayHelloWorld()方法前后输出两句字符串。

运行测试类输出如下:

before method invoke!
Hello World!
after method invoke!

   

此处Test类中的方法调用代码比较多,在我们的实际应用中可以通过配置文件来来简化客户端的调用实现。另外也可以通过动态代理来实现简单的AOP。

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程