📄 invoker.java
字号:
// lets try see if there's an iterator() method final Method method = value.getClass().getMethod("iterator", EMPTY_TYPES); if (method != null) { AccessController.doPrivileged(new PrivilegedAction() { public Object run() { method.setAccessible(true); return null; } }); return (Iterator) method.invoke(value, EMPTY_ARGUMENTS); } } catch (Exception e) { // ignore } } return asCollection(value).iterator(); } /** * @return true if the two objects are null or the objects are equal */ public boolean objectsEqual(Object left, Object right) { if (left == right) { return true; } if (left != null) { if (right == null) { return false; } if (left instanceof Comparable) { return compareTo(left, right) == 0; } else if (left instanceof List && right instanceof List) { return DefaultGroovyMethods.equals((List) left, (List) right); } else { return left.equals(right); } } return false; } public String inspect(Object self) { return format(self, true); } /** * Compares the two objects handling nulls gracefully and performing numeric type coercion if required */ public int compareTo(Object left, Object right) { //System.out.println("Comparing: " + left + " to: " + right); if (left == right) { return 0; } if (left == null) { return -1; } else if (right == null) { return 1; } if (left instanceof Comparable) { if (left instanceof Number) { if (isValidCharacterString(right)) { return asCharacter((Number) left).compareTo(asCharacter((String) right)); } return DefaultGroovyMethods.compareTo((Number) left, asNumber(right)); } else if (left instanceof Character) { if (isValidCharacterString(right)) { return ((Character) left).compareTo(asCharacter((String) right)); } else if (right instanceof Number) { return ((Character) left).compareTo(asCharacter((Number) right)); } } else if (right instanceof Number) { if (isValidCharacterString(left)) { return asCharacter((String) left).compareTo(asCharacter((Number) right)); } return DefaultGroovyMethods.compareTo(asNumber(left), (Number) right); } else if (left instanceof String && right instanceof Character) { return ((String) left).compareTo(right.toString()); } else if (left instanceof String && right instanceof GString) { return ((String) left).compareTo(right.toString()); } Comparable comparable = (Comparable) left; return comparable.compareTo(right); } if (left.getClass().isArray()) { Collection leftList = asCollection(left); if (right.getClass().isArray()) { right = asCollection(right); } return ((Comparable) leftList).compareTo(right); } /** todo we might wanna do some type conversion here */ throw new GroovyRuntimeException("Cannot compare values: " + left + " and " + right); } /** * A helper method to provide some better toString() behaviour such as turning arrays * into tuples */ public String toString(Object arguments) { if (arguments instanceof Object[]) return toArrayString((Object[]) arguments); else if (arguments instanceof Map) return toMapString((Map) arguments); else if (arguments instanceof Collection) return format(arguments, true); else return format(arguments, false); } /** * A helper method to format the arguments types as a comma-separated list */ public String toTypeString(Object[] arguments) { if (arguments == null) { return "null"; } StringBuffer argBuf = new StringBuffer(); for (int i = 0; i < arguments.length; i++) { if (i > 0) { argBuf.append(", "); } argBuf.append(arguments[i] != null ? arguments[i].getClass().getName() : "null"); } return argBuf.toString(); } /** * A helper method to return the string representation of a map with bracket boundaries "[" and "]". */ public String toMapString(Map arg) { if (arg == null) { return "null"; } if (arg.isEmpty()) { return "[:]"; } String sbdry = "["; String ebdry = "]"; StringBuffer buffer = new StringBuffer(sbdry); boolean first = true; for (Iterator iter = arg.entrySet().iterator(); iter.hasNext();) { if (first) first = false; else buffer.append(", "); Map.Entry entry = (Map.Entry) iter.next(); buffer.append(format(entry.getKey(), true)); buffer.append(":"); buffer.append(format(entry.getValue(), true)); } buffer.append(ebdry); return buffer.toString(); } /** * A helper method to return the string representation of a list with bracket boundaries "[" and "]". */ public String toListString(Collection arg) { if (arg == null) { return "null"; } if (arg.isEmpty()) { return "[]"; } String sbdry = "["; String ebdry = "]"; StringBuffer buffer = new StringBuffer(sbdry); boolean first = true; for (Iterator iter = arg.iterator(); iter.hasNext();) { if (first) first = false; else buffer.append(", "); Object elem = iter.next(); buffer.append(format(elem, true)); } buffer.append(ebdry); return buffer.toString(); } /** * A helper method to return the string representation of an arrray of objects * with brace boundaries "{" and "}". */ public String toArrayString(Object[] arguments) { if (arguments == null) { return "null"; } String sbdry = "{"; String ebdry = "}"; StringBuffer argBuf = new StringBuffer(sbdry); for (int i = 0; i < arguments.length; i++) { if (i > 0) { argBuf.append(", "); } argBuf.append(format(arguments[i], true)); } argBuf.append(ebdry); return argBuf.toString(); } protected String format(Object arguments, boolean verbose) { if (arguments == null) { return "null"; } else if (arguments.getClass().isArray()) { return format(asCollection(arguments), verbose); } else if (arguments instanceof Range) { Range range = (Range) arguments; if (verbose) { return range.inspect(); } else { return range.toString(); } } else if (arguments instanceof List) { List list = (List) arguments; StringBuffer buffer = new StringBuffer("["); boolean first = true; for (Iterator iter = list.iterator(); iter.hasNext();) { if (first) { first = false; } else { buffer.append(", "); } buffer.append(format(iter.next(), verbose)); } buffer.append("]"); return buffer.toString(); } else if (arguments instanceof Map) { Map map = (Map) arguments; if (map.isEmpty()) { return "[:]"; } StringBuffer buffer = new StringBuffer("["); boolean first = true; for (Iterator iter = map.entrySet().iterator(); iter.hasNext();) { if (first) { first = false; } else { buffer.append(", "); } Map.Entry entry = (Map.Entry) iter.next(); buffer.append(format(entry.getKey(), verbose)); buffer.append(":"); buffer.append(format(entry.getValue(), verbose)); } buffer.append("]"); return buffer.toString(); } else if (arguments instanceof Element) { Element node = (Element) arguments; OutputFormat format = new OutputFormat(node.getOwnerDocument()); format.setOmitXMLDeclaration(true); format.setIndenting(true); format.setLineWidth(0); format.setPreserveSpace(true); StringWriter sw = new StringWriter(); XMLSerializer serializer = new XMLSerializer(sw, format); try { serializer.asDOMSerializer(); serializer.serialize(node); } catch (IOException e) { } return sw.toString(); } else if (arguments instanceof String) { if (verbose) { String arg = ((String)arguments).replaceAll("\\n", "\\\\n"); // line feed arg = arg.replaceAll("\\r", "\\\\r"); // carriage return arg = arg.replaceAll("\\t", "\\\\t"); // tab arg = arg.replaceAll("\\f", "\\\\f"); // form feed arg = arg.replaceAll("\\\"", "\\\\\""); // double quotation amrk arg = arg.replaceAll("\\\\", "\\\\"); // back slash return "\"" + arg + "\""; } else { return (String) arguments; } } else { return arguments.toString(); } } /** * Looks up the given property of the given object */ public Object getProperty(Object object, String property) { if (object == null) { throw new NullPointerException("Cannot get property: " + property + " on null object"); } else if (object instanceof GroovyObject) { GroovyObject pogo = (GroovyObject) object; return pogo.getProperty(property); } else if (object instanceof Map) { Map map = (Map) object; return map.get(property); } else { return metaRegistry.getMetaClass(object.getClass()).getProperty(object, property); } } /** * Sets the property on the given object */ public void setProperty(Object object, String property, Object newValue) { if (object == null) { throw new GroovyRuntimeException("Cannot set property on null object"); } else if (object instanceof GroovyObject) { GroovyObject pogo = (GroovyObject) object; pogo.setProperty(property, newValue); } else if (object instanceof Map) { Map map = (Map) object; map.put(property, newValue); } else { if (object instanceof Class) metaRegistry.getMetaClass((Class) object).setProperty((Class) object, property, newValue); else metaRegistry.getMetaClass(object.getClass()).setProperty(object, property, newValue); } } /** * Looks up the given attribute (field) on the given object */ public Object getAttribute(Object object, String attribute) { if (object == null) { throw new NullPointerException("Cannot get attribute: " + attribute + " on null object"); /** } else if (object instanceof GroovyObject) { GroovyObject pogo = (GroovyObject) object; return pogo.getAttribute(attribute); } else if (object instanceof Map) { Map map = (Map) object; return map.get(attribute); */ } else { if (object instanceof Class) { return metaRegistry.getMetaClass((Class) object).getAttribute(object, attribute); } else if (object instanceof GroovyObject) { return ((GroovyObject)object).getMetaClass().getAttribute(object, attribute); } else { return metaRegistry.getMetaClass(object.getClass()).getAttribute(object, attribute); } } } /** * Sets the given attribute (field) on the given object */ public void setAttribute(Object object, String attribute, Object newValue) { if (object == null) { throw new GroovyRuntimeException("Cannot set attribute on null object"); /* } else if (object instanceof GroovyObject) { GroovyObject pogo = (GroovyObject) object; pogo.setProperty(attribute, newValue); } else if (object instanceof Map) { Map map = (Map) object; map.put(attribute, newValue); */ } else { if (object instanceof Class) { metaRegistry.getMetaClass((Class) object).setAttribute(object, attribute, newValue); } else if (object instanceof GroovyObject) { ((GroovyObject)object).getMetaClass().setAttribute(object, attribute, newValue); } else { metaRegistry.getMetaClass(object.getClass()).setAttribute(object, attribute, newValue); } } } /** * Returns the method pointer for the given object name */ public Closure getMethodPointer(Object object, String methodName) { if (object == null) { throw new NullPointerException("Cannot access method pointer for '" + methodName + "' on null object"); } return MetaClassHelper.getMethodPointer(object, methodName); } /** * Attempts to load the given class via name using the current class loader * for this code or the thread context class loader */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -