📄 javamembers.java
字号:
String setterName = "set".concat(nameComponent); if (ht.containsKey(setterName)) { // Is this value a method? Object member = ht.get(setterName); if (member instanceof NativeJavaMethod) { NativeJavaMethod njmSet = (NativeJavaMethod)member; if (getter != null) { // We have a getter. Now, do we have a matching // setter? Class type = getter.method().getReturnType(); setter = extractSetMethod(type, njmSet.methods, isStatic); } else { // No getter, find any set method setter = extractSetMethod(njmSet.methods, isStatic); } if (njmSet.methods.length > 1) { setters = njmSet; } } } // Make the property. BeanProperty bp = new BeanProperty(getter, setter, setters); toAdd.put(beanPropertyName, bp); } } // Add the new bean properties. for (Enumeration e = toAdd.keys(); e.hasMoreElements();) { Object key = e.nextElement(); Object value = toAdd.get(key); ht.put(key, value); } } // Reflect constructors Constructor[] constructors = getAccessibleConstructors(); ctors = new MemberBox[constructors.length]; for (int i = 0; i != constructors.length; ++i) { ctors[i] = new MemberBox(constructors[i]); } } private Constructor[] getAccessibleConstructors() { // The JVM currently doesn't allow changing access on java.lang.Class // constructors, so don't try if (includePrivate && cl != ScriptRuntime.ClassClass) { try { Constructor[] cons = cl.getDeclaredConstructors(); Constructor.setAccessible(cons, true); return cons; } catch (SecurityException e) { // Fall through to !includePrivate case Context.reportWarning("Could not access constructor " + " of class " + cl.getName() + " due to lack of privileges."); } } return cl.getConstructors(); } private Field[] getAccessibleFields() { if (includePrivate) { try { ArrayList fieldsList = new ArrayList(); Class currentClass = cl; while (currentClass != null) { // get all declared fields in this class, make them // accessible, and save Field[] declared = currentClass.getDeclaredFields(); for (int i = 0; i < declared.length; i++) { declared[i].setAccessible(true); fieldsList.add(declared[i]); } // walk up superclass chain. no need to deal specially with // interfaces, since they can't have fields currentClass = currentClass.getSuperclass(); } return (Field[]) fieldsList.toArray( new Field[fieldsList.size()]); } catch (SecurityException e) { // fall through to !includePrivate case } } return cl.getFields(); } private MemberBox findGetter(boolean isStatic, Hashtable ht, String prefix, String propertyName) { String getterName = prefix.concat(propertyName); if (ht.containsKey(getterName)) { // Check that the getter is a method. Object member = ht.get(getterName); if (member instanceof NativeJavaMethod) { NativeJavaMethod njmGet = (NativeJavaMethod) member; return extractGetMethod(njmGet.methods, isStatic); } } return null; } private static MemberBox extractGetMethod(MemberBox[] methods, boolean isStatic) { // Inspect the list of all MemberBox for the only one having no // parameters for (int methodIdx = 0; methodIdx < methods.length; methodIdx++) { MemberBox method = methods[methodIdx]; // Does getter method have an empty parameter list with a return // value (eg. a getSomething() or isSomething())? if (method.argTypes.length == 0 && (!isStatic || method.isStatic())) { Class type = method.method().getReturnType(); if (type != Void.TYPE) { return method; } break; } } return null; } private static MemberBox extractSetMethod(Class type, MemberBox[] methods, boolean isStatic) { // // Note: it may be preferable to allow NativeJavaMethod.findFunction() // to find the appropriate setter; unfortunately, it requires an // instance of the target arg to determine that. // // Make two passes: one to find a method with direct type assignment, // and one to find a widening conversion. for (int pass = 1; pass <= 2; ++pass) { for (int i = 0; i < methods.length; ++i) { MemberBox method = methods[i]; if (!isStatic || method.isStatic()) { Class[] params = method.argTypes; if (params.length == 1) { if (pass == 1) { if (params[0] == type) { return method; } } else { if (pass != 2) Kit.codeBug(); if (params[0].isAssignableFrom(type)) { return method; } } } } } } return null; } private static MemberBox extractSetMethod(MemberBox[] methods, boolean isStatic) { for (int i = 0; i < methods.length; ++i) { MemberBox method = methods[i]; if (!isStatic || method.isStatic()) { if (method.method().getReturnType() == Void.TYPE) { if (method.argTypes.length == 1) { return method; } } } } return null; } Hashtable getFieldAndMethodsObjects(Scriptable scope, Object javaObject, boolean isStatic) { Hashtable ht = isStatic ? staticFieldAndMethods : fieldAndMethods; if (ht == null) return null; int len = ht.size(); Hashtable result = new Hashtable(len); Enumeration e = ht.elements(); while (len-- > 0) { FieldAndMethods fam = (FieldAndMethods) e.nextElement(); FieldAndMethods famNew = new FieldAndMethods(scope, fam.methods, fam.field); famNew.javaObject = javaObject; result.put(fam.field.getName(), famNew); } return result; } static JavaMembers lookupClass(Scriptable scope, Class dynamicType, Class staticType, boolean includeProtected) { JavaMembers members; scope = ScriptableObject.getTopLevelScope(scope); ClassCache cache = ClassCache.get(scope); Map<Class<?>,JavaMembers> ct = cache.getClassCacheMap(); Class cl = dynamicType; for (;;) { members = ct.get(cl); if (members != null) { return members; } try { members = new JavaMembers(scope, cl, includeProtected); break; } catch (SecurityException e) { // Reflection may fail for objects that are in a restricted // access package (e.g. sun.*). If we get a security // exception, try again with the static type if it is interface. // Otherwise, try superclass if (staticType != null && staticType.isInterface()) { cl = staticType; staticType = null; // try staticType only once } else { Class parent = cl.getSuperclass(); if (parent == null) { if (cl.isInterface()) { // last resort after failed staticType interface parent = ScriptRuntime.ObjectClass; } else { throw e; } } cl = parent; } } } if (cache.isCachingEnabled()) ct.put(cl, members); return members; } RuntimeException reportMemberNotFound(String memberName) { return Context.reportRuntimeError2( "msg.java.member.not.found", cl.getName(), memberName); } private Class cl; private Hashtable members; private Hashtable fieldAndMethods; private Hashtable staticMembers; private Hashtable staticFieldAndMethods; MemberBox[] ctors; private boolean includePrivate;}class BeanProperty{ BeanProperty(MemberBox getter, MemberBox setter, NativeJavaMethod setters) { this.getter = getter; this.setter = setter; this.setters = setters; } MemberBox getter; MemberBox setter; NativeJavaMethod setters;}class FieldAndMethods extends NativeJavaMethod{ static final long serialVersionUID = -9222428244284796755L; FieldAndMethods(Scriptable scope, MemberBox[] methods, Field field) { super(methods); this.field = field; setParentScope(scope); setPrototype(ScriptableObject.getFunctionPrototype(scope)); } public Object getDefaultValue(Class hint) { if (hint == ScriptRuntime.FunctionClass) return this; Object rval; Class type; try { rval = field.get(javaObject); type = field.getType(); } catch (IllegalAccessException accEx) { throw Context.reportRuntimeError1( "msg.java.internal.private", field.getName()); } Context cx = Context.getContext(); rval = cx.getWrapFactory().wrap(cx, this, rval, type); if (rval instanceof Scriptable) { rval = ((Scriptable) rval).getDefaultValue(hint); } return rval; } Field field; Object javaObject;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -