`

Struts2 中出现的Jdk动态代理实例和方法

 
阅读更多
package com.opensymphony.xwork2.inject;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Proxy;
import java.util.List;
import java.util.ArrayList;

/**
 * Context of a dependency construction. Used to manage circular references.
 *
 * @author crazybob@google.com (Bob Lee)
 */
class ConstructionContext<T> {

  T currentReference;
  boolean constructing;

  List<DelegatingInvocationHandler<T>> invocationHandlers;

  T getCurrentReference() {
    return currentReference;
  }

  void removeCurrentReference() {
    this.currentReference = null;
  }

  void setCurrentReference(T currentReference) {
    this.currentReference = currentReference;
  }

  boolean isConstructing() {
    return constructing;
  }

  void startConstruction() {
    this.constructing = true;
  }

  void finishConstruction() {
    this.constructing = false;
    invocationHandlers = null;
  }
   
 //此处应该是该方法的核心
//
  Object createProxy(Class<? super T> expectedType) {
    // TODO: if I create a proxy which implements all the interfaces of
    // the implementation type, I'll be able to get away with one proxy
    // instance (as opposed to one per caller).

    if (!expectedType.isInterface()) {
      throw new DependencyException(
          expectedType.getName() + " is not an interface.");
    }

    if (invocationHandlers == null) {
      invocationHandlers = new ArrayList<DelegatingInvocationHandler<T>>();
    }

    DelegatingInvocationHandler<T> invocationHandler =
        new DelegatingInvocationHandler<T>();
    invocationHandlers.add(invocationHandler);
    
    return Proxy.newProxyInstance(
      expectedType.getClassLoader(), // 加载接口的类加载器
      new Class[] { expectedType }, // 接口集合
      invocationHandler  // handler处理类
    );
  }
 // 注意此处调用方法 中的参数 和值  认真看看希望能看出端倪来。此处很妙
  void setProxyDelegates(T delegate) {
    if (invocationHandlers != null) {
      for (DelegatingInvocationHandler<T> invocationHandler : invocationHandlers) {
        invocationHandler.setDelegate(delegate);
      }
    }
  }
// 内部静态类
  static class DelegatingInvocationHandler<T> implements InvocationHandler {

    T delegate;

    public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable {
      if (delegate == null) {
        throw new IllegalStateException(
            "Not finished constructing. Please don't call methods on this"
                + " object until the caller's construction is complete.");
      }

      try {     // method.invoke 中的参数 代理类  和要传入的参数
        return method.invoke(delegate, args); 
                //method方法应该是delegate接口中的
      } catch (IllegalAccessException e) {
        throw new RuntimeException(e);
      } catch (IllegalArgumentException e) {
        throw new RuntimeException(e);
      } catch (InvocationTargetException e) {
        throw e.getTargetException();
      }
    }
    
    // 此处为何留一个接口方法呢?
    void setDelegate(T delegate) {
      this.delegate = delegate;
    }
  }
}

 

分享到:
评论

相关推荐

    struts 拦截器动态代理

    Struts拦截器是Java Web开发框架Struts2中的核心组件之一,它允许开发者在Action执行前后插入自定义的处理逻辑,实现AOP(面向切面编程)的理念。动态代理则是Java提供的一种机制,允许在运行时创建接口的实现类实例...

    struts2+spring+velocity扩展实例V1版本

    在这个实例中,我们可能会看到Spring如何配置并管理Struts2中的bean,以及如何处理业务逻辑。 Velocity是Apache软件基金会的一个开源项目,它是一个模板引擎,专注于视图层的渲染。Velocity允许开发者使用简单的...

    jdk1.4下struts2应用实例含单元测试

    总结来说,这个实例提供了一个在旧版JDK环境下使用Struts2和Spring构建Web应用的例子,通过它你可以了解到如何在早期的Java环境中实现MVC架构,以及如何利用Spring进行依赖管理和测试。同时,这也是一个很好的历史...

    struts2入门实例教程详解

    按照Struts1.x的程序开发步骤,我们可以逐一对应到Struts2中: 1. **安装Struts2:** - 不同于Struts1的Servlet配置,Struts2需要配置Filter。在`web.xml`中添加Struts2的Filter配置,如: ```xml ...

    struts框架实例

    Struts2 提供的 OGNL(Object-Graph Navigation Language)表达式语言可以方便地在 JSP 页面中访问 Action 中的属性和方法。 8. **控制器层**: Struts2 的核心是 Action 类,它们接收请求,执行业务逻辑,然后将...

    Struts2、Spring和Hibernate应用实例.doc

    在本文中,我们将详细介绍 Struts2、Spring 和 Hibernate 三种流行框架的整合应用,并通过实例来展示如何使用这些框架来实现 CRUD 操作。 Struts2 概述 Struts2 是一个基于 MVC 模式的 Web 框架,自推出以来受到...

    struts2+mybatis 入门实例

    Struts2和MyBatis是Java Web开发中常用的两个框架,它们分别负责MVC模式中的控制层和数据访问层。本实例将引导你入门这两个框架的整合使用。 **Struts2** 是一个强大的MVC框架,它继承了Struts1的优点,并引入了更...

    tom9 jdk10环境下struts2+hibernate3.6.10jar包.zip

    Struts2和Hibernate是两个非常重要的Java开源框架,它们在企业级Web开发中扮演着核心角色。本压缩包“tom9 jdk10环境下struts2+hibernate3.6.10jar包.zip”提供了在Tomcat9服务器和JDK10环境下运行Struts2与...

    struts2分页代码的示例

    下面是我用Struts2做的一个分页显示实例,基本的思路是:把数据库表中的每一行数据封装成一个对象,用一个返回类型为List的方法返回这些对象,接着在Struts2的action里面定义一个List属性,用这个List来接收从数据库...

    struts2 tiles实例 eclipse下运行

    在"struts2 tiles实例 eclipse下运行"这个项目中,我们将深入理解如何在Eclipse开发环境中配置和运行一个基于Struts2和Tiles的Web应用。首先,确保你已经安装了Eclipse IDE,并且配置好了JDK以及Tomcat服务器。接着...

    struts2 Hello word 完整实例

    1. **Action类**:在Struts2中,业务逻辑通常封装在Action类中。Action类是一个Java类,它定义了处理用户请求的方法。在“Hello World”实例中,你会找到一个名为`HelloWorldAction`的类,其中包含了一个简单的执行...

    Struts2、Spring和Hibernate应用实例

    ### Struts2、Spring和Hibernate应用实例 #### 一、简介与背景 随着Java技术的发展,Web应用程序变得越来越复杂,为了提高开发效率和维护性,出现了多种轻量级的Java Web框架,其中最为著名的三个框架分别是Struts...

    struts2.3框架包和简单入门实例

    Struts2.3框架是Java Web开发中常用的一个开源MVC框架,它的出现极大地简化了基于JSP和Servlet的应用程序构建。本实例旨在为初学者提供一个基础的入门指南,帮助理解Struts2.3的核心概念和使用方法。 首先,让我们...

    struts2_入门实例

    在Struts1.x中,ActionServlet是入口点,而在Struts2中,入口点变成了一个Filter,即`FilterDispatcher`,需要在`web.xml`中配置。 创建基于Struts2的Web程序通常包括以下步骤: 1. **配置Struts2 Filter** - 在`...

    ioc框架,通过动态代理实现.

    Struts2是一个流行的MVC框架,通过集成IOC框架,如Spring,可以方便地管理Struts2中的动作类(Action)和业务服务层(Service)。 在学习和应用IOC框架,尤其是通过动态代理实现时,我们需要了解以下知识点: 1. ...

    Struts2简单可运行实例

    在实际开发中,Struts2还提供了丰富的功能,如国际化、数据校验、文件上传、动态方法调用等。通过扩展配置和自定义拦截器,你可以构建出更加复杂和灵活的应用系统。学习和掌握Struts2将有助于提升你的Java Web开发...

Global site tag (gtag.js) - Google Analytics