From 3106119ff1afb7ec3705d27e932d4997477d5a74 Mon Sep 17 00:00:00 2001 From: 502647092 Date: Tue, 10 Oct 2017 21:11:35 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=B1=BB=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E5=88=9D=E5=A7=8B=E5=8C=96=E9=94=99=E8=AF=AF=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 502647092 --- src/main/resources/kit/reflect.js | 100 +++++++++++++++--------------- 1 file changed, 49 insertions(+), 51 deletions(-) diff --git a/src/main/resources/kit/reflect.js b/src/main/resources/kit/reflect.js index 1d00434..573dfff 100644 --- a/src/main/resources/kit/reflect.js +++ b/src/main/resources/kit/reflect.js @@ -7,10 +7,59 @@ /*global Java, base, module, exports, require, __FILE__*/ var Class = Java.type('java.lang.Class'); var NoSuchFieldException = Java.type('java.lang.NoSuchFieldException'); +var methodCache = []; function Reflect(obj) { this.obj = obj; this.class = obj instanceof Class ? obj : obj.class; + this.field = function (name) { + try { + // Try getting a public field + var field = this.class.field(name); + return on(field.get(this.obj)); + } catch (ex) { + // Try again, getting a non-public field + try { + return on(accessible(declaredField(this.class, name)).get(this.obj)); + } catch (ex) { + throw new NoSuchFieldException(ex); + } + } + }; + + this.method = function () { + var name = arguments[0]; + var clazzs = Array.prototype.slice.call(arguments, 1); + try { + return this.class.method(name, clazzs); + } catch (ex) { + return this.class.declaredMethod(name, clazzs); + } + }; + + this.cacheMethod = function () { + var name = arguments[0]; + var mkey = this.class.name + '.' + name; + if (!methodCache[mkey]) { + methodCache[mkey] = this.method(name, arguments.slice(1)); + } + return methodCache[mkey]; + }; + + this.call = function () { + var name = arguments[0]; + var params = Array.prototype.slice.call(arguments, 1); + var method = this.cacheMethod(name, types(params)); + return exports.on(method.invoke(this.get(), params)); + }; + + this.get = function () { + return arguments.length === 1 ? this.field(arguments[0]) : this.obj; + }; + + this.create = function () { + return on(declaredConstructor(this.class, arguments).newInstance(arguments)); + }; } /** @@ -60,57 +109,6 @@ function declaredField(clazz, name) { return field; } -Reflect.field = function (name) { - try { - // Try getting a public field - var field = this.class.field(name); - return on(field.get(this.obj)); - } catch (ex) { - // Try again, getting a non-public field - try { - return on(accessible(declaredField(this.class, name)).get(this.obj)); - } catch (ex) { - throw new NoSuchFieldException(ex); - } - } -}; - -Reflect.method = function () { - var name = arguments[0]; - var clazzs = arguments.slice(1); - try { - return this.class.method(name, clazzs); - } catch (ex) { - return this.class.declaredMethod(name, clazzs); - } -}; - -var methodCache = []; - -Reflect.cacheMethod = function () { - var name = arguments[0]; - var mkey = this.class.name + '.' + name; - if (!methodCache[mkey]) { - methodCache[mkey] = this.method(name, arguments.slice(1)); - } - return methodCache[mkey]; -}; - -Reflect.call = function () { - var name = arguments[0]; - var params = arguments.slice(1); - var method = this.method(name, types(params)); - return exports.on(method.invoke(this.get(), params)); -}; - -Reflect.get = function () { - return arguments.length === 1 ? this.field(arguments[0]) : this.obj; -}; - -Reflect.create = function () { - return on(declaredConstructor(this.class, arguments).newInstance(arguments)); -}; - function on(obj) { return new Reflect(obj); }