`
jianchen
  • 浏览: 343353 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

动态代理模式使用初探

JDK 
阅读更多

jdk文档:

写道
动态代理类(以下简称为代理类)是一个实现在创建类时在运行时指定的接口列表的类,该类具有下面描述的行为。 代理接口 是代理类实现的一个接口。代理实例 是代理类的一个实例。 每个代理实例都有一个关联的调用处理程序 对象,它可以实现接口 InvocationHandler。通过其中一个代理接口的代理实例上的方法调用将被指派到实例的调用处理程序的 Invoke 方法,并传递代理实例、识别调用方法的 java.lang.reflect.Method 对象以及包含参数的 Object 类型的数组。调用处理程序以适当的方式处理编码的方法调用,并且它返回的结果将作为代理实例上方法调用的结果返回。

 

测试代码如下:
一个接口:MyInterface

public interface MyInterface {
public void print();
public void test(int num);
}

 

实现以上接口的类:MyTest

public class MyTest implements MyInterface{
public void print(){
    System.out.println("MyTest print");
}
public void test(int num){
    System.out.println(num);
}
}

 


处理类:MyTestHandler

public class MyTestHandler implements InvocationHandler {

    private MyInterface mytest = null;

    public MyInterface bind(MyInterface test) { //注意传递的参数类型是接口,而不是实现类
        this.mytest = test;
        MyInterface proxyTest = (MyInterface) Proxy.newProxyInstance(test.getClass().getClassLoader(), test.getClass().getInterfaces(), this);
        return proxyTest;
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //具体的处理策略,根据方法名判断
        Object obj = null;
        if ("print".equals(method.getName())) {
            System.out.println("got it");
        } else if ("test".equals(method.getName())) {
            int num = (Integer)args[0];
            System.out.println(num+2);
        } else {
            obj = method.invoke(mytest, args);  //交给目标对象处理
        }
        return obj;
    }
}

 

测试类:Main

public class Main {
public static void main(String args[]){
MyTest test = new MyTest();
MyTestHandler handler = new MyTestHandler();
MyInterface proxy = handler.bind(test);//绑定方法返回对象的代理,以后可以操作该代理,隐藏了实际的对象
proxy.test(3);
}
}
 



分析:
    通过对代理类的调用,代替了对实际类MyTest的调用,在invoke方法中,可以截获对方法的调用,针对特定的策略采取相应的措施。无需特殊处理的话,还是调用实际的对象的方法。

补充:
摘自jdk文档:

Proxy的静态方法:

写道
newProxyInstance
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
throws IllegalArgumentException
返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。此方法相当于:
Proxy.getProxyClass(loader, interfaces).
getConstructor(new Class[] { InvocationHandler.class }).
newInstance(new Object[] { handler });
 

 

分享到:
评论

相关推荐

    初探Delphi模式编程

    代理模式为其他对象提供一种代理以控制对这个对象的访问。在Delphi中,例如,我们可以创建一个代理类,用来处理对象的创建、访问权限控制或者在访问前后的额外操作。 8. **命令模式**: 命令模式将请求封装为一个...

    设计模式初探

    2. **结构型模式** 关注如何将类和对象组合成更大的结构,如适配器模式、装饰器模式、代理模式、桥接模式、组合模式、外观模式和享元模式。这些模式帮助我们处理类与类之间的关系,优化系统结构。 - 适配器模式使...

    00-初探 Laravel 和其中的设计模式(3).html

    代理模式( Proxy ) 外观模式( Facade ) 桥接模式( Bridge ) 组合模式( Composite ) 享元模式( Flyweight ) 行为型模式包含了: 策略模式( Strategy ) 模板方法模式( Template Method ) 观察者模式( ...

    论文研究-初探基于动态电子商务的虚拟企业.pdf

    综上所述,动态电子商务技术能够为虚拟企业的构建提供强大的支撑,其中Web服务是企业协作的桥梁,而代理技术则增强了企业间的动态交互能力。UDDI作为服务发现机制,进一步提高了虚拟企业成员之间合作的便捷性。这些...

    初探spring aop内部实现 java

    对于接口,Spring使用Java动态代理(JDK Proxy)创建代理对象;而对于类,Spring则使用CGLIB库生成子类代理。这两种方式都是在运行时生成代理对象,从而在方法调用前后插入切面逻辑。 接下来,我们转向DataSource的...

    论文研究-国有资产管理中的多级诱导模式——多重角色行为初探.pdf

    论文研究-国有资产管理中的多级诱导模式——多重角色行为初探.pdf, 从现实中广泛存在的多级委托-代理关系入手, 对国有资产管理建立了主从策略模型, 并尝试研究多级管理...

    Delphi编程模式

    - **代理模式**:在Delphi中,TComponent类就是一种代理,它代表了控件,并处理其属性、事件和方法。 - **装饰器模式**:通过动态添加组件属性和方法,可以扩展组件的功能,而无需修改原始组件代码。 3. **Delphi...

    SDP的offer/answer模型

    - 模式3至5(100rel支持下的模式)在支持可靠100rel响应的实体间使用,通过1xx临时响应携带offer/answer提前建立会话或更新参数。 - 模式6(UPDATE请求用于会话更新),允许在会话进行中通过UPDATE请求进行参数...

    SQL SERVER 2000初探.pdf

    3. msdb数据库:支持SQL Server代理服务,包括警报、任务调度以及记录操作员的操作提供存储空间。 4. tempdb数据库:为所有临时表、临时存储过程以及其他临时操作提供存储空间。tempdb是SQL Server中的全局共享资源...

    企业集团法律风险防控信息化建设初探.docx

    - **集中管理模式**:企业集团及其下属单位的法律事务管理机构负责处理本单位的诉讼纠纷(包括诉讼、仲裁及非诉案件)。重大诉讼案件可由集团总部法律部门介入指导。通常情况下,诉讼案件由外部律师代理,内部法律...

    ICommand接口的实现及应用初探

    在.NET框架中,MVVM(Model-View-ViewModel)设计模式被广泛应用于WPF和UWP等GUI应用程序...在深入学习和实践中,我们可以结合其他MVVM工具和设计模式,如事件代理、依赖注入等,进一步提升应用的可扩展性和灵活性。

    中国物流企业的流程优化初探.doc

    《中国物流企业的流程优化初探》 随着中国物流行业的快速发展,物流企业正逐步走向成熟,越来越多的企业专注于特定的服务领域,实施市场细分和战略定位,努力提升核心竞争力。然而,虽然宏观发展方向已初具雏形,但...

    蘑菇街App容器化初探.pdf

    在这份关于蘑菇街App容器化初探的文档中,我们可以看到多个涉及到IT行业尤其是移动应用开发和运营的重要知识点。以下内容将对这些知识点进行详细阐述: 首先,文档提到的“组件化”是当前移动应用开发中一个非常...

    Java ee 企业应用开发:第7章 在Spring中管理事务.ppt

    #### 7.1.1 从代理机制初探AOP 代理机制是AOP实现的基础。代理可以在目标对象前设置一个中介,处理额外的职责,例如日志记录。代理有两种主要形式: 1. **静态代理**:在编译时创建代理类,代理类和目标类都实现...

    航运电商平台交易主体身份识别及提示条款初探.pdf

    例如,通过对用户行为数据的分析,电商平台可以更准确地识别用户需求,为货主和货运代理提供更加个性化的服务,从而吸引更多的用户入驻和使用。 航运电商的生态系统构建是一个持续进化的过程,平台需要根据市场变化...

    Apress.Pro.Objective-C.Design.Patterns.for.iOS

    - **第1章**:设计模式初探,介绍设计模式的基本概念、历史背景以及其在iOS开发中的重要性。 - **第2章**:案例研究:设计一款应用,通过实际项目来展示设计模式的应用场景和实现步骤。 #### 第二部分:对象创建...

    Spring.net二----初探IOC容器.rar源代码

    控制反转是一种设计模式,它将对象的创建和依赖关系的管理交给了容器,而不是由对象自身负责。这样做的好处在于提高了代码的可测试性、可维护性和松耦合性。 在Spring.NET中,我们可以使用XML配置或基于代码的配置...

    大数据背景下企业财务会计向管理会计转型初探.pdf

    财务会计基于委托代理理论,主要是对过去发生的经济活动进行统计、核算和监督,形成财务报表,以确保信息的真实性、可靠性。而管理会计则基于管理经济学,服务对象是企业内部经营者,通过加工整理财务会计的数据来...

    计算机人工智能技术的应用及未来发展初探.pdf

    计算机人工智能技术是指利用计算机技术模拟人类的思维模式、学习能力和问题解决能力的一系列技术,这包括但不限于机器学习、深度学习、专家系统、自然语言处理等技术领域。随着中国经济的快速增长和科技的迅猛发展,...

Global site tag (gtag.js) - Google Analytics