/** * This method returns is a given field is final or not. * Since we might have removed the <code>final</code> modifier * during our instrumentation, we also check the list of those * static fields we have modified during the instrumentation. * * @param field field to check * @return */ public static boolean isFinalField(Field field) { if (Properties.RESET_STATIC_FINAL_FIELDS) { if (Modifier.isFinal(field.getModifiers())) { return true; } else { String fieldName = field.getName(); final boolean isModifiedStaticField = ModifiedTargetStaticFields.getInstance().containsField(fieldName); return isModifiedStaticField; } } else { final boolean isFinalField = Modifier.isFinal(field.getModifiers()); return isFinalField; } }
/** * gets the current set of modified target static fields * * @return */ public static ModifiedTargetStaticFields getInstance() { if (instance == null) { instance = new ModifiedTargetStaticFields(); } return instance; }
/** * After all the class code was visited, If no <clinit> was found, an empty * __STATIC_RESET() method is synthesized. */ @Override public void visitEnd() { if (!clinitFound && !isInterface && !isAnonymous && !resetMethodAdded) { // create brand new __STATIC_RESET if (!definesUid) { // determineSerialisableUID(); // createSerialisableUID(); } createEmptyStaticReset(); } else if (clinitFound) { if (!definesUid) { // createSerialisableUID(); } } if (!modifiedStaticFields.isEmpty()) { ModifiedTargetStaticFields.getInstance().addFinalFields(modifiedStaticFields); } super.visitEnd(); }
ModifiedTargetStaticFields.resetSingleton();