public JavaThing[] getFields() { // pass false to verbose mode so that dereference // warnings are not printed. return parseFields(false);
}
// returns the value of field of given name public JavaThing getField(String name) {
JavaThing[] flds = getFields();
JavaField[] instFields = getClazz().getFieldsForInstance(); for (int i = 0; i < instFields.length; i++) { if (instFields[i].getName().equals(name)) { return flds[i];
}
} returnnull;
}
publicvoid visitReferencedObjects(JavaHeapObjectVisitor v) { super.visitReferencedObjects(v);
JavaThing[] flds = getFields(); for (int i = 0; i < flds.length; i++) { if (flds[i] != null) { if (v.mightExclude()
&& v.exclude(getClazz().getClassForField(i),
getClazz().getFieldForInstance(i)))
{ // skip it
} elseif (flds[i] instanceof JavaHeapObject) {
v.visit((JavaHeapObject) flds[i]);
}
}
}
}
publicboolean refersOnlyWeaklyTo(Snapshot ss, JavaThing other) { if (ss.getWeakReferenceClass() != null) { finalint referentFieldIndex = ss.getReferentFieldIndex(); if (ss.getWeakReferenceClass().isAssignableFrom(getClazz())) { // // REMIND: This introduces a dependency on the JDK // implementation that is undesirable.
JavaThing[] flds = getFields(); for (int i = 0; i < flds.length; i++) { if (i != referentFieldIndex && flds[i] == other) { returnfalse;
}
} returntrue;
}
} returnfalse;
}
/** *Describethereferencethatthisthinghastotarget.Thiswillonly *becallediftargetisinthearrayreturnedbygetChildrenForRootset.
*/ public String describeReferenceTo(JavaThing target, Snapshot ss) {
JavaThing[] flds = getFields(); for (int i = 0; i < flds.length; i++) { if (flds[i] == target) {
JavaField f = getClazz().getFieldForInstance(i); return"field " + f.getName();
}
} returnsuper.describeReferenceTo(target, ss);
}
public String toString() { if (getClazz().isString()) {
JavaThing value = getField("value"); if (value instanceof JavaValueArray) { return ((JavaValueArray)value).valueString();
} else { return"null";
}
} else { returnsuper.toString();
}
}
private JavaThing[] parseFields(boolean verbose) {
JavaClass cl = getClazz(); int target = cl.getNumFieldsForInstance();
JavaField[] fields = cl.getFields();
JavaThing[] fieldValues = new JavaThing[target];
Snapshot snapshot = cl.getSnapshot(); int fieldNo = 0; // In the dump file, the fields are stored in this order: // fields of most derived class (immediate class) are stored // first and then the super class and so on. In this object, // fields are stored in the reverse ("natural") order. i.e., // fields of most super class are stored first.
// target variable is used to compensate for the fact that // the dump file starts field values from the leaf working // upwards in the inheritance hierarchy, whereas JavaObject // starts with the top of the inheritance hierarchy and works down.
target -= fields.length;
JavaClass currClass = cl; long offset = dataStartOffset(); for (int i = 0; i < fieldValues.length; i++, fieldNo++) { while (fieldNo >= fields.length) {
currClass = currClass.getSuperclass();
fields = currClass.getFields();
fieldNo = 0;
target -= fields.length;
}
JavaField f = fields[fieldNo]; char sig = f.getSignature().charAt(0); try { switch (sig) { case'L': case'[': { long id = objectIdAt(offset);
offset += idSize();
JavaObjectRef ref = new JavaObjectRef(id);
fieldValues[target+fieldNo] = ref.dereference(snapshot, f, verbose); break;
} case'Z': { byte value = byteAt(offset);
offset++;
fieldValues[target+fieldNo] = new JavaBoolean(value != 0); break;
} case'B': { byte value = byteAt(offset);
offset++;
fieldValues[target+fieldNo] = new JavaByte(value); break;
} case'S': { short value = shortAt(offset);
offset += 2;
fieldValues[target+fieldNo] = new JavaShort(value); break;
} case'C': { char value = charAt(offset);
offset += 2;
fieldValues[target+fieldNo] = new JavaChar(value); break;
} case'I': { int value = intAt(offset);
offset += 4;
fieldValues[target+fieldNo] = new JavaInt(value); break;
} case'J': { long value = longAt(offset);
offset += 8;
fieldValues[target+fieldNo] = new JavaLong(value); break;
} case'F': { float value = floatAt(offset);
offset += 4;
fieldValues[target+fieldNo] = new JavaFloat(value); break;
} case'D': { double value = doubleAt(offset);
offset += 8;
fieldValues[target+fieldNo] = new JavaDouble(value); break;
} default: thrownew RuntimeException("invalid signature: " + sig);
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.2Bemerkung:
(vorverarbeitet am 2026-06-10)
¤