var classLoader = createObject("java", "java.lang.ClassLoader").getSystemClassLoader(); var objectClass = classLoader.loadClass("java.lang.Object"); _setArray(createObject("java", "java.lang.reflect.Array")); _setClassMethod(objectClass.getMethod("getClass", JavaCast("null", 0))); _setObjectClass(objectClass); _setClass(arguments.class); _setModifier(createObject("java", "java.lang.reflect.Modifier")); _setStaticFields(); _initMethodCollection(); return this; var constructor = 0; var instance = 0; //make sure we only ever have one instance if(_hasClassInstance()) { return _getClassInstance(); } constructor = _resolveMethodByParams("Constructor", _getClass().getConstructors(), arguments); instance = constructor.newInstance(_buildArgumentArray(arguments)); _setClassInstance(instance); return _getClassInstance(); var method = _findMethod(arguments.missingMethodName, arguments.missingMethodArguments); if(_getModifier().isStatic(method.getModifiers())) { return method.invoke(JavaCast("null", 0), _buildArgumentArray(arguments.missingMethodArguments)); } else { if(NOT _hasClassInstance()) { //run the default constructor, just like in normal CF, if there is no instance init(); } return method.invoke(_getClassInstance(), _buildArgumentArray(arguments.missingMethodArguments)); } var fields = _getClass().getFields(); var counter = 1; var len = ArrayLen(fields); var field = 0; for(; counter <= len; counter++) { field = fields[counter]; if(_getModifier().isStatic(field.getModifiers())) { this[field.getName()] = field.get(JavaCast("null", 0)); } } var len = StructCount(arguments); var objArray = _getArray().newInstance(_getObjectClass(), len); var counter = 1; var obj = 0; for(; counter <= len; counter++) { obj = arguments[counter]; _getArray().set(objArray, counter - 1, obj); } return objArray; var decision = 0; if(StructKeyExists(_getMethodCollection(), arguments.methodName)) { decision = StructFind(_getMethodCollection(), arguments.methodName); //if there is only one option, try it, it's only going to throw a runtime exception if it doesn't work. if(ArrayLen(decision) == 1) { return decision[1]; } else { return _resolveMethodByParams(arguments.methodName, decision, arguments.methodArgs); } } throw("JavaProxy.MethodNotFoundException", "Could not find the designated method", "Could not find the method '#arguments.methodName#' in the class #_getClass().getName()#"); var decisionLen = ArrayLen(arguments.decision); var method = 0; var counter = 1; var argLen = ArrayLen(arguments.methodArgs); var parameters = 0; var paramLen = 0; var pCounter = 0; var param = 0; var class = 0; var found = true; for(; counter <= decisionLen; counter++) { method = arguments.decision[counter]; parameters = method.getParameterTypes(); paramLen = ArrayLen(parameters); found = true; if(argLen eq paramLen) { for(pCounter = 1; pCounter <= paramLen AND found; pCounter++) { param = parameters[pCounter]; class = _getClassMethod().invoke(arguments.methodArgs[pCounter], JavaCast("null", 0)); if(param.isAssignableFrom(class)) { found = true; } else if(param.isPrimitive()) //if it's a primitive, it can be mapped to object primtive classes { if(param.getName() eq "boolean" AND class.getName() eq "java.lang.Boolean") { found = true; } else if(param.getName() eq "int" AND class.getName() eq "java.lang.Integer") { found = true; } else if(param.getName() eq "long" AND class.getName() eq "java.lang.Long") { found = true; } else if(param.getName() eq "float" AND class.getName() eq "java.lang.Float") { found = true; } else if(param.getName() eq "double" AND class.getName() eq "java.lang.Double") { found = true; } else if(param.getName() eq "char" AND class.getName() eq "java.lang.Character") { found = true; } else if(param.getName() eq "byte" AND class.getName() eq "java.lang.Byte") { found = true; } else if(param.getName() eq "short" AND class.getName() eq "java.lang.Short") { found = true; } else { found = false; } } else { found = false; } } if(found) { return method; } } } throw("JavaProxy.MethodNotFoundException", "Could not find the designated method", "Could not find the method '#arguments.methodName#' in the class #_getClass().getName()#"); var methods = _getClass().getMethods(); var len = ArrayLen(methods); var counter = 1; var method = 0; _setMethodCollection(StructNew()); for(; counter <= len; counter++) { method = methods[counter]; if(NOT StructKeyExists(_getMethodCollection(), method.getName())) { StructInsert(_getMethodCollection(), method.getName(), ArrayNew(1)); } ArrayAppend(StructFind(_getMethodCollection(), method.getName()), method); }