methodresolver.java

来自「java jdk 1.4的源码」· Java 代码 · 共 1,035 行 · 第 1/3 页

JAVA
1,035
字号
          }          else            return -1;        }        else          return -1;      }    }    return score;  }    /**   * Convert the given XSLT object to an object of    * the given class.   * @param xsltObj The XSLT object that needs conversion.   * @param javaClass The type of object to convert to.   * @returns An object suitable for passing to the Method.invoke    * function in the args array, which may be null in some cases.   * @throws TransformerException may be thrown for Xalan conversion   * exceptions.   */  static Object convert(Object xsltObj, Class javaClass)    throws javax.xml.transform.TransformerException  {    if(xsltObj instanceof XObject)    {      XObject xobj = ((XObject)xsltObj);      int xsltClassType = xobj.getType();      switch(xsltClassType)      {      case XObject.CLASS_NULL:        return null;              case XObject.CLASS_BOOLEAN:        {          if(javaClass == java.lang.String.class)            return xobj.str();          else            return new Boolean(xobj.bool());        }        // break; Unreachable      case XObject.CLASS_NUMBER:        {          if(javaClass == java.lang.String.class)            return xobj.str();          else if(javaClass == Boolean.TYPE)            return new Boolean(xobj.bool());          else           {            return convertDoubleToNumber(xobj.num(), javaClass);          }        }        // break; Unreachable              case XObject.CLASS_STRING:        {          if((javaClass == java.lang.String.class) ||             (javaClass == java.lang.Object.class))            return xobj.str();          else if(javaClass == Character.TYPE)          {            String str = xobj.str();            if(str.length() > 0)              return new Character(str.charAt(0));            else              return null; // ??          }          else if(javaClass == Boolean.TYPE)            return new Boolean(xobj.bool());          else           {            return convertDoubleToNumber(xobj.num(), javaClass);          }        }        // break; Unreachable              case XObject.CLASS_RTREEFRAG:        {          // GLP:  I don't see the reason for the isAssignableFrom call          //       instead of an == test as is used everywhere else.          //       Besides, if the javaClass is a subclass of NodeIterator          //       the condition will be true and we'll create a NodeIterator          //       which may not match the javaClass, causing a RuntimeException.          // if((NodeIterator.class.isAssignableFrom(javaClass)) ||          if ( (javaClass == NodeIterator.class) ||               (javaClass == java.lang.Object.class) )          {            DTMIterator dtmIter = ((XRTreeFrag) xobj).asNodeIterator();            return new DTMNodeIterator(dtmIter);          }          else if (javaClass == NodeList.class)          {            return ((XRTreeFrag) xobj).convertToNodeset();          }          // Same comment as above          // else if(Node.class.isAssignableFrom(javaClass))          else if(javaClass == Node.class)          {            DTMIterator iter = ((XRTreeFrag) xobj).asNodeIterator();            int rootHandle = iter.nextNode();            DTM dtm = iter.getDTM(rootHandle);            return dtm.getNode(dtm.getFirstChild(rootHandle));          }          else if(javaClass == java.lang.String.class)          {            return xobj.str();          }          else if(javaClass == Boolean.TYPE)          {            return new Boolean(xobj.bool());          }          else if(javaClass.isPrimitive())          {            return convertDoubleToNumber(xobj.num(), javaClass);          }          else          {            DTMIterator iter = ((XRTreeFrag) xobj).asNodeIterator();            int rootHandle = iter.nextNode();            DTM dtm = iter.getDTM(rootHandle);            Node child = dtm.getNode(dtm.getFirstChild(rootHandle));            if(javaClass.isAssignableFrom(child.getClass()))              return child;            else              return null;          }        }        // break; Unreachable              case XObject.CLASS_NODESET:        {          // GLP:  I don't see the reason for the isAssignableFrom call          //       instead of an == test as is used everywhere else.          //       Besides, if the javaClass is a subclass of NodeIterator          //       the condition will be true and we'll create a NodeIterator          //       which may not match the javaClass, causing a RuntimeException.          // if((NodeIterator.class.isAssignableFrom(javaClass)) ||          if ( (javaClass == NodeIterator.class) ||               (javaClass == java.lang.Object.class) )          {            return xobj.nodeset();          }          // Same comment as above          // else if(NodeList.class.isAssignableFrom(javaClass))          else if(javaClass == NodeList.class)          {            return xobj.nodelist();          }          // Same comment as above          // else if(Node.class.isAssignableFrom(javaClass))          else if(javaClass == Node.class)          {            // Xalan ensures that iter() always returns an            // iterator positioned at the beginning.            DTMIterator ni = xobj.iter();            int handle = ni.nextNode();            if (handle != DTM.NULL)              return ni.getDTM(handle).getNode(handle); // may be null.            else              return null;          }          else if(javaClass == java.lang.String.class)          {            return xobj.str();          }          else if(javaClass == Boolean.TYPE)          {            return new Boolean(xobj.bool());          }          else if(javaClass.isPrimitive())          {            return convertDoubleToNumber(xobj.num(), javaClass);          }          else          {            DTMIterator iter = xobj.iter();            int childHandle = iter.nextNode();            DTM dtm = iter.getDTM(childHandle);            Node child = dtm.getNode(childHandle);            if(javaClass.isAssignableFrom(child.getClass()))              return child;            else              return null;          }        }        // break; Unreachable                // No default:, fall-through on purpose      } // end switch      xsltObj = xobj.object();          } // end if if(xsltObj instanceof XObject)        // At this point, we have a raw java object, not an XObject.    if (null != xsltObj)    {      if(javaClass == java.lang.String.class)      {        return xsltObj.toString();      }      else if(javaClass.isPrimitive())      {        // Assume a number conversion        XString xstr = new XString(xsltObj.toString());        double num = xstr.num();        return convertDoubleToNumber(num, javaClass);      }      else if(javaClass == java.lang.Class.class)      {        return xsltObj.getClass();      }      else      {        // Just pass the object directly, and hope for the best.        return xsltObj;      }                }    else    {      // Just pass the object directly, and hope for the best.      return xsltObj;    }  }    /**   * Do a standard conversion of a double to the specified type.   * @param num The number to be converted.   * @param javaClass The class type to be converted to.   * @return An object specified by javaClass, or a Double instance.   */  static Object convertDoubleToNumber(double num, Class javaClass)  {    // In the code below, I don't check for NaN, etc., instead     // using the standard Java conversion, as I think we should     // specify.  See issue-runtime-errors.    if((javaClass == Double.TYPE) ||       (javaClass == java.lang.Double.class))      return new Double(num);    else if(javaClass == Float.TYPE)      return new Float(num);    else if(javaClass == Long.TYPE)    {      // Use standard Java Narrowing Primitive Conversion      // See http://java.sun.com/docs/books/jls/html/5.doc.html#175672      return new Long((long)num);    }    else if(javaClass == Integer.TYPE)    {      // Use standard Java Narrowing Primitive Conversion      // See http://java.sun.com/docs/books/jls/html/5.doc.html#175672      return new Integer((int)num);    }    else if(javaClass == Short.TYPE)    {      // Use standard Java Narrowing Primitive Conversion      // See http://java.sun.com/docs/books/jls/html/5.doc.html#175672      return new Short((short)num);    }    else if(javaClass == Character.TYPE)    {      // Use standard Java Narrowing Primitive Conversion      // See http://java.sun.com/docs/books/jls/html/5.doc.html#175672      return new Character((char)num);    }    else if(javaClass == Byte.TYPE)    {      // Use standard Java Narrowing Primitive Conversion      // See http://java.sun.com/docs/books/jls/html/5.doc.html#175672      return new Byte((byte)num);    }    else     // Some other type of object    {      return new Double(num);    }  }  /**   * Format the message for the NoSuchMethodException containing    * all the information about the method we're looking for.   */  private static String errString(String callType,    // "function" or "element"                                  String searchType,  // "method" or "constructor"                                  Class classObj,                                  String funcName,                                  int searchMethod,                                  Object[] xsltArgs)  {    String resultString = "For extension " + callType                                              + ", could not find " + searchType + " ";    switch (searchMethod)    {      case STATIC_ONLY:        return resultString + "static " + classObj.getName() + "."                             + funcName + "([ExpressionContext,] " + errArgs(xsltArgs, 0) + ").";      case INSTANCE_ONLY:        return resultString + classObj.getName() + "."                            + funcName + "([ExpressionContext,] " + errArgs(xsltArgs, 0) + ").";      case STATIC_AND_INSTANCE:        return resultString + classObj.getName() + "." + funcName + "([ExpressionContext,] " + errArgs(xsltArgs, 0) + ").\n"                            + "Checked both static and instance methods.";      case DYNAMIC:        return resultString + "static " + classObj.getName() + "." + funcName                            + "([ExpressionContext, ]" + errArgs(xsltArgs, 0) + ") nor\n"                            + classObj + "." + funcName + "([ExpressionContext,] " + errArgs(xsltArgs, 1) + ").";      default:        if (callType.equals("function"))      // must be a constructor        {          return resultString + classObj.getName()                                  + "([ExpressionContext,] " + errArgs(xsltArgs, 0) + ").";        }        else                                  // must be an element call        {          return resultString + classObj.getName() + "." + funcName                    + "(org.apache.xalan.extensions.XSLProcessorContext, "                    + "org.apache.xalan.templates.ElemExtensionCall).";        }    }      }  private static String errArgs(Object[] xsltArgs, int startingArg)  {    StringBuffer returnArgs = new StringBuffer();    for (int i = startingArg; i < xsltArgs.length; i++)    {      if (i != startingArg)        returnArgs.append(", ");      if (xsltArgs[i] instanceof XObject)        returnArgs.append(((XObject) xsltArgs[i]).getTypeString());            else        returnArgs.append(xsltArgs[i].getClass().getName());    }    return returnArgs.toString();  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?