代理模式-Java动态代理的实现及应用

原创 2017年06月03日 17:45:31

Java动态代理其实写日常业务代码是不常用的,但在框架层一起RPC框架的客户端是非常常见及重要的。spring的核心思想aop的底层原理实现就使用到了java的动态代理技术。
使用代理可以实现对象的远程调用以及aop的实现。
java的动态代理的实现,主要依赖InvoctionHandler(接口)和Proxy(类)这两个。

下面是一个例子
实现的代理的一般需要有个接口

package com.yasin.ProxyLearn;

public interface IStudy {

    public void learn();

    public String getKonwledge();

}

该接口的实现的类

package com.yasin.ProxyLearn;

public class Study implements IStudy{

    public void learn() {
        System.out.println("我要开始学习了!");
    }

    public String getKonwledge() {

        return "Java真的强";
    }

}

代理类,该类需要实现InvacationHandler接口

package com.yasin.ProxyLearn;

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

public class StudyProxy implements InvocationHandler{

    //真实要被代理的对象
    private Object study;

    public StudyProxy(Object study){
        this.study=study;
    }

    /**
     * 当被代理对象执行自己的方法时,便会执行这个方法
     */
    public Object invoke(Object object, Method method, Object[] args) throws Throwable {

        Object obj=null;

        System.out.println("代理执行前我可以执行一些操作");

        //执行被代理对象的方法
        obj = method.invoke(study, args);


        System.out.println("代理执行后我还可以执行一些操作");

        return obj;
    }

}

测试类

package com.yasin.JavaLearn;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.xml.DOMConfigurator;

import com.yasin.ProxyLearn.IStudy;
import com.yasin.ProxyLearn.Study;
import com.yasin.ProxyLearn.StudyProxy;

/**
 * Hello world!
 *
 */
public class App {

    public static void main(String[] args) {

        IStudy study = new Study();

        InvocationHandler handler = new StudyProxy(study);

        IStudy proxyStudy =(IStudy)Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class[] {IStudy.class}, handler);

        proxyStudy.learn();

        System.out.println(proxyStudy.getKonwledge());

    }
}

以上就是java动态代理的基础使用,在spring aop及rpc的远程服务端的实现要比这复杂下,以后会在深入探讨的。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

前端背景图片自适应

Maven生成WAR包时自动更新版本号version

某些情况下(这种情况一般很少见),使用maven构建项目时,需要一个不重复的序列号,比如说,打包时,包名称以当前构建时间结尾,或者每次生成的jar包中包含唯一的序列号,等等; 这个时候,就用到了bu...

动态代理模式的Java实现

动态代理(Dynamic Proxy):相比前一篇文章所实现的静态代理,动态代理具有更强的灵活性,因为它不用在我们设计实现的时候就指定某一个代理类来代理哪一个被代理对象,我们可以把这种指定延迟到程序运...

Java动态代理模式理解和实现

在研究了静态代理模式之后,参照网上的许多博客,便了解到了关于许多静态代理的不足之处,当业务逻辑趋于复杂时,需要进行代理的内容增加,就会导致代码量急剧增加(当然了,现在没有遇到过这个情况,也就先跟着道听...

Java动态代理模式jdk和cglib的2种实现以及二者的区别(AOP面向切面的前奏)

关于动态代理模式里面有两种实现,一种是jdk实现,一种是cglib来实现。 下面来整jdk来实现动态代理的Java实例。 jdk动态代理模式里面有个拦截器的概念,在jdk中,只要实现了Invocati...

(Dynamic Proxy)动态代理模式的Java实现

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://haolloyin.blog.51cto.com/1177454/333257 ...

Java 例子 反射实现 AOP 动态代理模式(Spring Aop实现原理)

我们写个例子看看我们最简单的解决方案 我们先写一个接口IHello.java代码如下:  1package sinosoft.dj.aop.staticaop;  2  3public i...

java代理模式和动态代理

  • 2017年03月06日 21:38
  • 132KB
  • 下载

Java代理模式Java动态代理

  • 2014年08月15日 08:49
  • 476KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:代理模式-Java动态代理的实现及应用
举报原因:
原因补充:

(最多只允许输入30个字)