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 + -
显示快捷键?