public static boolean isPackageAccessible(Class<?> clazz) { return haveAccessibility() || !PACKAGE_ACCESS.matcher(clazz.getName()).matches(); }
/** Package private abstract invocable constructor. * Collects an accessible member entity as the common invocable apparatus. * If running privileged we enforce accessibility for all types here. * @param member an accessible member entity */ <M extends AccessibleObject & Member> Invocable(M member) { flags = member.getModifiers(); declaringClass = member.getDeclaringClass(); name = member.getName(); toString = member.toString(); lastParameterIndex = 0; isStatic = Reflect.isStatic(member); isSynthetic = member.isSynthetic(); if (Capabilities.haveAccessibility() && member.getDeclaringClass() != Class.class) member.setAccessible(true); }
/** * @throws ReflectError if the field is not found. */ /* Note: this should really just throw NoSuchFieldException... need to change related signatures and code. */ protected static Field resolveExpectedJavaField(Class clas, String fieldName, boolean staticOnly) throws UtilEvalError, ReflectError { Field field; try { if (Capabilities.haveAccessibility()) { field = findAccessibleField(clas, fieldName); } else // Class getField() finds only public (and in interfaces, etc.) { field = clas.getField(fieldName); } } catch (NoSuchFieldException e) { throw new ReflectError("No such field: " + fieldName, e); } catch (SecurityException e) { throw new UtilTargetError("Security Exception while searching fields of: " + clas, e); } if (staticOnly && !Modifier.isStatic(field.getModifiers())) { throw new UtilEvalError("Can't reach instance field: " + fieldName + " from static context: " + clas.getName()); } return field; }
/** Recursive processing of interfaces. * Methods are stored by reference. * @param interfaces for whom members are collected */ private void processInterfaces(Class<?>[] interfaces) { for (Class<?> intr : interfaces) { if (isPackageAccessible(intr)) { memberCache.init(intr); for (Field f : intr.getDeclaredFields()) cacheMember(Invocable.get(f)); for (Method m: intr.getDeclaredMethods()) if (isPublic(m) || haveAccessibility()) cacheMember(memberCache.get(intr) .findMethod(m.getName(), m.getParameterTypes())); } processInterfaces(intr.getInterfaces()); } }
if (isPackageAccessible(type) && ((isPackageScope(type) && !isPrivate(type)) || isPublic(type) || haveAccessibility())) { for (Field f : type.getDeclaredFields()) if (isPublic(f) || haveAccessibility()) cacheMember(Invocable.get(f)); for (Method m : type.getDeclaredMethods()) if (isPublic(m) || haveAccessibility()) if (clazz == type) cacheMember(Invocable.get(m)); else cacheMember(memberCache.get(type)
if ( !Capabilities.haveAccessibility() )
Object val = Primitive.VOID; if ( null != var && (!var.hasModifier("private") || haveAccessibility()) ) val = ns.unwrapVariable(var); if (Primitive.VOID != val) Object val = Primitive.VOID; if ( null != var && (!var.hasModifier("private") || haveAccessibility()) ) val = ns.unwrapVariable(var); if (Primitive.VOID != val)
Constructor[] constructors = Capabilities.haveAccessibility() ? clas.getDeclaredConstructors() : clas.getConstructors();
/** Get an LHS reference to an object field. This method also deals with the field style property access. In the field does not exist we check for a property setter. */ static LHS getLHSObjectField( Object object, String fieldName ) throws UtilEvalError, ReflectError { if ( object instanceof This ) return new LHS( ((This)object).namespace, fieldName, false ); try { Invocable f = resolveExpectedJavaField( object.getClass(), fieldName, false/*staticOnly*/ ); return new LHS(object, f); } catch ( ReflectError e ) { NameSpace ns = getThisNS(object); if (isGeneratedClass(object.getClass()) && null != ns && ns.isClass) { Variable var = ns.getVariableImpl(fieldName, true); if ( null != var && (!var.hasModifier("private") || haveAccessibility()) ) return new LHS(ns, fieldName); } // not a field, try property access if ( hasObjectPropertySetter( object.getClass(), fieldName ) ) return new LHS( object, fieldName ); else throw e; } }
boolean publicOnly = !Capabilities.haveAccessibility();
static LHS getLHSStaticField(Class<?> clas, String fieldName) throws UtilEvalError, ReflectError { try { Invocable f = resolveExpectedJavaField( clas, fieldName, true/*onlystatic*/); return new LHS(f); } catch ( ReflectError e ) { NameSpace ns = getThisNS(clas); if (isGeneratedClass(clas) && null != ns && ns.isClass) { Variable var = ns.getVariableImpl(fieldName, true); if ( null != var && (!var.hasModifier("private") || haveAccessibility()) ) return new LHS(ns, fieldName); } // not a field, try property access if ( hasObjectPropertySetter( clas, fieldName ) ) return new LHS( clas, fieldName ); else throw e; } }