关闭

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

标签: java动态代理
321人阅读 评论(0) 收藏 举报
分类:

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的远程服务端的实现要比这复杂下,以后会在深入探讨的。

0
0
查看评论

Java代理模式 动态代理 的应用场景

先看一下代理模式,这个应该是设计模式中最简单的一个了,类图   代理模式最大的特点就是代理类和实际业务类实现同一个接口(或继承同一父类),代理对象持有一个实际对象的引用,外部调用时操作的是代理对象,而在代理对象的内部实现中又会去调用实际对象的操作  ...
  • yansong_8686
  • yansong_8686
  • 2016-02-19 00:22
  • 5891

代理模式及Java实现动态代理

代理模式 定义:给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问,即客户不直接操控原对象,而是通过代理对象间接地操控原对象。 代理模式UML图 在上图中: RealSubject 是原对象(本文把原对象称为"委托对象"),Proxy 是代理对象。S...
  • GarfieldEr007
  • GarfieldEr007
  • 2016-12-18 18:25
  • 771

动态代理使用

动态代理使用 java动态代理机制以巧妙的方式实现了代理模式的设计理念。 代理模式示例代码 public interface Subject { public void doSomething(); } public class RealSubj...
  • anlidengshiwei
  • anlidengshiwei
  • 2015-09-11 15:36
  • 349

Java代理和动态代理机制分析和应用

本博文中项目代码已开源下载地址:GitHubJava代理和动态代理机制分析和应用概述代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。根据代理类的生成时间不同可以将代理分为静态代理...
  • fengyuzhengfan
  • fengyuzhengfan
  • 2015-12-02 19:54
  • 3712

JAVA的动态代理模式分析以及与spring AOP的比较

本文是结合《轻量级Java EE企业应用实战(李刚)》这本书以及个人的一点理解写的,记录下来以作学习之用。 1.代理就是一个java对象代表另一个java对象来采取行动。为什么需要采用代理呢?很简单,就是在某些情况下,客户端代码不想或者是不能直接调用被调用者,这时候代理对象就可以在客户和目标对象之...
  • yyzyyx
  • yyzyyx
  • 2016-05-25 16:43
  • 846

详解java动态代理机制以及使用场景(一)

说起java动态代理,在我刚开始学java时对这项技术也是十分困惑,明明可以直接调通的对象方法为什么还要使用动态代理?随着学习的不断深入和工作经验的积累,慢慢的体会并理解了java动态代理机制。昨天再给公司新同事做技术培训时有同学就对动态代理产生了疑问,我这里梳理一遍一并记录一下,方便大家查看对自己...
  • u011784767
  • u011784767
  • 2017-10-19 10:29
  • 998

代理模式及Java动态代理

以老板和秘书之间的代理关系,处理事务,秘书作为老板的代理人,可以接电话。 1.首先写一个Handle接口,接口里有一个方法:接电话 public interface Handle { public void answerPhone(); }2.分别创建两个类:老板类和秘书类,都实现了Handle...
  • okiwilldoit
  • okiwilldoit
  • 2014-01-17 16:41
  • 385

java动态代理的两种实现方式

一说到动态代理,我们第一个想到肯定是大名鼎鼎的Spring AOP了。在AOP的源码中用到了两种动态代理来实现拦截切入功能:jdk动态代理和cglib动态代理。两种方法同时存在,各有优劣。jdk动态代理是由java内部的反射机制来实现的,cglib动态代理底层则是借助asm来实现的。总的来说,反射...
  • zy_281870667
  • zy_281870667
  • 2016-11-18 15:45
  • 1205

Proxy代理模式之应用

一,定义:   代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。            二,其类图:            三...
  • liujiahan629629
  • liujiahan629629
  • 2014-02-18 21:35
  • 14321

java动态代理--一个简单的例子

这几天看视频看到了java的动态代理,这里写一个小例子。在写例子的时候发现:认为自己会了,和能写出来真不是一个概念。还是要多写代码,然后写博客再深入一些,费曼学习法--教,是最好的学。 1.什么是动态代理 代理模式  代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的...
  • Heyeverybody
  • Heyeverybody
  • 2016-02-21 12:02
  • 1537
    个人资料
    • 访问:74873次
    • 积分:1324
    • 等级:
    • 排名:千里之外
    • 原创:59篇
    • 转载:1篇
    • 译文:0篇
    • 评论:31条