WEB开发网
开发学院软件开发Java Java 编程的动态性,第3部分: 应用反射 阅读

Java 编程的动态性,第3部分: 应用反射

 2010-03-18 00:00:00 来源:WEB开发网   
核心提示: 实际的库实现还涉及到本文没有提及的几个类,我不打算一一介绍每一个类,Java 编程的动态性,第3部分: 应用反射(7),因为其中大部分类都与库的反射方面不相关,我将提到的是, handle() 方法在解释完实参值之后,又调用 ArgumentProcessor 的 setValue() 方法,我

实际的库实现还涉及到本文没有提及的几个类。我不打算一一介绍每一个类,因为其中大部分类都与库的反射方面不相关。我将提到的是,我选择将目标对象存为 ArgumentProcessor 类的一个字段,并在这个类中实现一个形参字段的真正设置。这种方法为参数处理提供了一个简单的模式: ArgumentProcessor 类扫描实参以发现形参标记,为每个标记查找相应的形参定义(总是 ParameterDef 的一个子类),再调用这个定义的 handle() 方法。 handle() 方法在解释完实参值之后,又调用 ArgumentProcessor 的 setValue() 方法。清单5显示了 ArgumentProcessor 类的不完整版本,包括在构造函数中的形参绑定调用以及 setValue() 方法:

清单 5. 主库类的部分清单

public class ArgumentProcessor 
{ 
  private Object m_targetObject; // parameter value object 
  private int m_currentIndex;   // current argument position 
  ... 
  public ArgumentProcessor(ParameterDef[] parms, Object target) { 
     
    // bind all parameters to target class 
    for (int i = 0; i < parms.length; i++) { 
      parms[i].bindToClass(target.getClass()); 
    } 
     
    // save target object for later use 
    m_targetObject = target; 
  } 
   
  public void setValue(Object value, Field field) { 
    try { 
     
      // set parameter field value using reflection 
      field.set(m_targetObject, value); 
       
    } catch (IllegalAccessException ex) { 
      throw new IllegalArgumentException("Field " + field.getName() + 
        " is not accessible in object of class " + 
        m_targetObject.getClass().getName()); 
    } 
 } 
   
  public void reportArgumentError(char flag, String text) { 
   throw new ArgumentErrorException(text + " for argument '" + 
    flag + "' in argument " + m_currentIndex); 
  } 
   
  public static int processArgs(String[] args, 
    ParameterDef[] parms, Object target) { 
    ArgumentProcessor inst = new ArgumentProcessor(parms, target); 
    ... 
  } 
} 

上一页  2 3 4 5 6 7 8  下一页

Tags:Java 编程 动态性

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接