private FieldReader getFunctorField(ClassReader cls) { return cls.getField("$$jso_functor$$"); }
@Override public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { if (classReader == null || (access & (Opcodes.ACC_PUBLIC | Opcodes.ACC_PROTECTED)) == 0) { return null; } JCLItem item = new JCLItem(JCLItemType.FIELD, name + ":" + desc); FieldReader field = classReader.getField(name); item.status = field != null ? JCLStatus.FOUND : JCLStatus.MISSING; item.visibility = (access & Opcodes.ACC_PROTECTED) != 0 ? JCLVisibility.PROTECTED : JCLVisibility.PUBLIC; jclClass.items.add(item); if (item.status == JCLStatus.MISSING) { jclClass.status = JCLStatus.PARTIAL; } return null; }
@Override public ReflectField getDeclaredField(String name) { resolve(); return declaredFields.computeIfAbsent(name, n -> { FieldReader fld = classReader.getField(n); return fld != null ? new ReflectFieldImpl(this, fld) : null; }); }
default FieldReader resolve(FieldReference field) { return getAncestors(field.getClassName()) .map(cls -> cls.getField(field.getFieldName())) .filter(Objects::nonNull) .findFirst().orElse(null); }
@Override public ReflectField getField(String name) { resolve(); if (classReader == null) { return null; } FieldReader fieldReader = classReader.getField(name); return fieldReader != null && fieldReader.getLevel() == AccessLevel.PUBLIC ? getDeclaredField(name) : null; }
public ValueType getFieldType(FieldReference fieldReference) { ClassReader cls = classSource.get(fieldReference.getClassName()); FieldReader field = cls.getField(fieldReference.getFieldName()); return field.getType(); }
private FieldReference getRealField(FieldReference fieldRef) { String initialCls = fieldRef.getClassName(); String cls = fieldRef.getClassName(); while (cls != null) { ClassReader clsReader = classSource.get(cls); if (clsReader != null) { FieldReader fieldReader = clsReader.getField(fieldRef.getFieldName()); if (fieldReader != null) { return fieldReader.getReference(); } } cls = clsReader.getParent(); } return fieldRef; } }
private void handleFieldSet(DependencyAgent agent, MethodDependency method) { CallLocation location = new CallLocation(method.getReference()); DependencyNode classValueNode = agent.linkMethod(getFields) .addLocation(location) .getVariable(0).getClassValueNode(); classValueNode.addConsumer(reflectedType -> { if (reflectedType.getName().startsWith("[")) { return; } Set<String> accessibleFields = getAccessibleFields(agent, reflectedType.getName()); ClassReader cls = agent.getClassSource().get(reflectedType.getName()); for (String fieldName : accessibleFields) { FieldReader field = cls.getField(fieldName); FieldDependency fieldDep = agent.linkField(field.getReference()).addLocation(location); propagateSet(agent, field.getType(), method.getVariable(2), fieldDep.getValue(), location); linkClassIfNecessary(agent, field, location); } }); }
private void handleFieldGet(DependencyAgent agent, MethodDependency method) { CallLocation location = new CallLocation(method.getReference()); DependencyNode classValueNode = agent.linkMethod(getFields) .addLocation(location) .getVariable(0).getClassValueNode(); classValueNode.addConsumer(reflectedType -> { if (reflectedType.getName().startsWith("[")) { return; } Set<String> accessibleFields = getAccessibleFields(agent, reflectedType.getName()); ClassReader cls = agent.getClassSource().get(reflectedType.getName()); for (String fieldName : accessibleFields) { FieldReader field = cls.getField(fieldName); FieldDependency fieldDep = agent.linkField(field.getReference()) .addLocation(location); propagateGet(agent, field.getType(), fieldDep.getValue(), method.getResult(), location); linkClassIfNecessary(agent, field, location); } }); }
private FieldReader getFunctorField(ClassReader cls) { return cls.getField("$$jso_functor$$"); }
private boolean fieldExists(String cls, String field) { ClassReader classHolder = classSource.get(cls); return classHolder.getField(field) != null; } }
default FieldReader resolve(FieldReference field) { return getAncestors(field.getClassName()) .map(cls -> cls.getField(field.getFieldName())) .filter(candidate -> candidate != null) .findFirst().orElse(null); }
@Override public ReflectField getDeclaredField(String name) { resolve(); return declaredFields.computeIfAbsent(name, n -> { FieldReader fld = classReader.getField(n); return fld != null ? new ReflectFieldImpl(this, fld) : null; }); }
@Override public ReflectField getField(String name) { resolve(); if (classReader == null) { return null; } FieldReader fieldReader = classReader.getField(name); return fieldReader != null && fieldReader.getLevel() == AccessLevel.PUBLIC ? getDeclaredField(name) : null; }
public ValueType getFieldType(FieldReference fieldReference) { ClassReader cls = classSource.get(fieldReference.getClassName()); FieldReader field = cls.getField(fieldReference.getFieldName()); return field.getType(); }