`

JAVA动态代理实现

    博客分类:
  • java
阅读更多
代理模式:为其他对象提供一种代理以控制对这个对象的访问.说白了就是,在一些情况下客户不想或不能直接引一个对象,而代理对象可以在客户和目标对象之间起到中介作用.去掉客户不能看到的内容和服务或都增添客户需要的额外服务.
给大家举个比较简单的例子:
假如你买台IBM的笔记本,IBM产家是不提供鼠标的.但是我们如果从代理商的手里买就有鼠标和送.
很简单的例子,写几个类来实现一下吧.
首先设计一个购买的接口代码如下:(ComputerInterface.java)
package test.lyx;
publicinterface ComputerInterface {
    publicvoid buy();
}
建一个电脑类实现购买的接口代码如下:(Computer.java)
package test.lyx;
publicclass Computer implements ComputerInterface{
    private String pcName="IBMT60";
    privateintpcPrice=17800;
    public String getPcName() {
        returnpcName;
    }
    publicvoid setPcName(String pcName) {
        this.pcName = pcName;
    }
    publicint getPcPrice() {
        returnpcPrice;
    }
    publicvoid setPcPrice(int pcPrice) {
        this.pcPrice = pcPrice;
    }
    publicvoid buy() {
    System.out.print("获得笔记本电脑:"+pcName+"一台");
    }
}
再建设一个代理商的类:用来完成买电脑和赠送鼠标:(ComputerProxy.java)
package test.lyx;
publicclass ComputerProxy {
    private ComputerInterface pci;
    public ComputerInterface getPci() {
        returnpci;
    }
    publicvoid setPci(ComputerInterface pci) {
        this.pci = pci;
    }
    publicvoid buy(){
        pci.buy();
        System.out.println("赠送鼠标一个");
    }
}
建一个主函数测试一下吧:(TestDemo.java)
package test.lyx;
publicclass TestDemo {
    publicstaticvoid main(String[] args) {
        ComputerProxy c1=new ComputerProxy();
        c1.setPci(new Computer());
        c1.buy();
    }
}
运行结果如下:
获得笔记本电脑:IBMT60一台获得鼠标一个
以上就是代理功能的实现,由代理商销售笔记本,并赠送鼠标.但是这样的程序只适合是销售IBM笔记本.那么如果要是其它品牌呢.所以我们来更改一个代理类.来实现动态的代理.
建立一个类代码如下:(ComputerProxy2.java)
package test.lyx;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
publicclass ComputerProxy2 implements InvocationHandler{
    private Object delegate;
    //描述是谁的代理,也就是与那个类有关系
    public Object bind(Object delegate){
        this.delegate=delegate;
        return Proxy.newProxyInstance(delegate.getClass().getClassLoader(), delegate.getClass().getInterfaces(),this);
    }
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
           System.out.println("赠送鼠标一个!");
       Object result=method.invoke(delegate, args);
       return result;
    }
}
然后在主函数中加上:
        ComputerProxy2 c2=new ComputerProxy2();
        ComputerInterface ci2=(ComputerInterface)c2.bind(new Computer());
        ci2.buy();
就可以实现动态代理了.


动态代理一定要实现这个InvocationHandle接口.接口里面有两个方法.一个bind描述代理那个类,也就是与那个类有关系,主函数里我调用bind方法时给出Computer.也就是代理的Computer类.还有一个方法invoke就是代理与要执行的方法.


对啊,IBM的本只送鼠标.如果现在SONY的本送鼠标和包,静态的代理就实现不了了.只有改程序了.使用动态代理,我们只关注买的是什么品牌的本.送的是什么东西.


好,如果你让你这个动态代理去卖SONY的本子,他怎么送包?你还不是要修改invoke方法么?

动态代理的好处并不是要动态处理不同的任务,而是动态处理不同的类型,我所说的类型,指的是接口类型。
如果说你的IBM本和sony本继承的同样的接口,用动态代理一点儿意义都没有了。因为它和静态代理一样,只能完成一件附加任务。


嗯,也有道理,
为其他对象提供一种代理以控制对这个对象的访问,说白了就是,在一些情况下客户不想或都不能直接引用一个对象,而代理对象可以在客户和目标对象之间起到中介作用,去掉客户不能看到的内容和服务或都增添客户需要的额外服务.
无论是什么代理商本是肯定的卖的,我们就要实现ComputerInterface这个接口,而不同的代理商优惠的条件不同,在这里也就是说赠的东西不同,我们代理的目的,和现时一样,本本卖的基础上,各个代理商送的东西不同.invoke这个方法在这里就描述了我们送的是什么东西.
我是这样认为的.



可能我们想的都一样,只是描述的不是很清楚吧。

动态代理和静态代理的主要区别是,静态代理已经知道自己要代理什么类型的东西了,而动态代理却不知道。
比如说,静态代理已经明确是代理买还是卖,还是修理。

但是动态代理不知道,它可以代理一切,只要是有可代理的东西。

但是在代理商自己的附加动作上,两种代理方式应该都是确定了的。
如果一个代理商要送鼠标,那他只能送鼠标,不管他是卖什么东西。
如果想送鼠标又要送键盘,那就得再找一个代理商,不管是静态的还是动态的。
分享到:
评论

相关推荐

    用Java动态代理实现AOP

    Java动态代理实现AOP Java动态代理是实现Aspect Oriented Programming(AOP)的重要手段。在Java中,动态代理可以通过java.lang.reflect InvocationHandler接口和java.lang.reflect.Proxy类来实现。AOP的主要思想...

    java 动态代理实现AOP

    ### Java动态代理实现AOP详解 #### 一、引言 随着软件开发复杂度的提升,传统的面向对象编程(OOP)已经难以满足现代软件工程的需求。为了更好地管理跨切面的关注点,如日志记录、性能监控、安全控制等,面向切面...

    Java动态代理实现数据源连接池

    总的来说,Java动态代理实现数据源连接池的核心思想是利用`InvocationHandler`来拦截对数据库操作的调用,通过代理对象在每次操作前后进行连接的获取和释放,从而实现连接池的逻辑。这种方式虽然相比现成的连接池库...

    java动态代理实现数据库连接池

    ### Java动态代理实现数据库连接池 #### 背景与挑战 在开发应用程序时,数据库连接池是一个常用且重要的组成部分。频繁地建立和断开数据库连接不仅效率低下,还可能导致性能瓶颈。为了解决这一问题,引入了数据库...

    用Java动态代理实现委托模式

    下面我们将详细探讨如何使用Java动态代理实现委托模式,以及相关的源码和工具应用。 首先,理解委托模式的基本概念。委托模式通常由三部分组成:委托者(Delegate)、被委托者(Subject)和客户端(Client)。委托...

    java动态代理实现详解

    Java 动态代理是Java平台提供的一种强大的工具,它允许我们在运行时动态生成代理类,这些代理类可以实现一组指定的接口,同时还能在方法调用前后添加自定义的行为。这种机制大大简化了面向切面编程(AOP)和事件监听...

    使用Java动态代理实现一个简单的网络请求拦截器.txt

    ### 使用Java动态代理实现一个简单的网络请求拦截器 #### 一、引言 在软件开发过程中,为了增强程序的功能或方便进行调试与监控,我们常常需要在不改变原有业务逻辑的基础上,添加一些额外的行为(如日志记录、...

    java 动态代理实现注解日志拦截

    在本场景中,我们将探讨如何使用Java动态代理结合注解来实现日志拦截,以便在调用方法时记录相关的日志信息。 首先,让我们了解Java动态代理的基本概念。在Java中,动态代理主要由两个类实现:`java.lang.reflect....

    java动态代理实现自定义连接池

    Java中的动态代理是通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现的。Proxy类用于创建动态代理实例,而InvocationHandler接口则定义了调用处理程序的逻辑,即当代理对象的方法被...

    java动态代理 经典文章(word 2007格式的)

    - `设计模式:用Java动态代理实现AOP.docx`可能包含了如何使用Java动态代理来实现设计模式,尤其是代理模式,以达到AOP的效果。 - `Spring AOP入门实例详解.docx`可能涵盖了Spring AOP的基本概念、配置以及如何...

    JAVA动态代理实现Demo(JDK动态代理和CGLIB动态代理)

    Java提供了两种主要的动态代理实现方式:JDK动态代理和CGLIB动态代理。 **JDK动态代理**: JDK动态代理基于接口实现,也就是说,被代理的对象必须实现至少一个接口。代理机制的核心是`java.lang.reflect.Proxy`类和...

    JAVA实现动态代理的简单流程

    在深入探讨Java动态代理的实现过程之前,我们首先需要理解动态代理的基本概念及其在Java中的应用价值。动态代理,顾名思义,是在运行时动态创建代理对象的一种机制,它无需在编译期就确定代理类的具体实现,而是通过...

    Java动态代理实现 Proxy InvocationHandler

    在本文中,我们将深入探讨这两个关键组件以及如何使用它们来实现动态代理。 ### 1. Java动态代理的基本概念 动态代理允许我们在运行时创建一个实现了特定接口的新类。这个新类(代理类)可以代理原始类(目标类)...

Global site tag (gtag.js) - Google Analytics