for (Iterator<ClassObserver> i = classObserverList.iterator(); i.hasNext();) { i.next().observeClass(javaClass);
for (ClassObserver aClassObserverList : classObserverList) { aClassObserverList.observeClass(javaClass);
	private void examineClass(AnalysisPass analysisPass, String className) throws InterruptedException {		if (DEBUG) System.out.println("Examining class " + className);		long entireClassAnalysisStart = 0;						if (TIMEDEBUG || DEBUG)  {			entireClassAnalysisStart = System.currentTimeMillis();		}		this.currentClass = className;				Detector[] detectors = analysisPass.getDetectorList();		try {			JavaClass javaClass = Repository.lookupClass(className);			// Notify ClassObservers			for (Iterator<ClassObserver> i = classObserverList.iterator(); i.hasNext();) {				i.next().observeClass(javaClass);			}			// Create a ClassContext for the class			ClassContext classContext = analysisContext.getClassContext(javaClass);			// Run the Detectors			for (int i = 0; i < detectors.length; ++i) {				if (Thread.interrupted())					throw new InterruptedException();				Detector detector = detectors[i];				if (detector instanceof StatelessDetector) {					try {						detector = (Detector)((StatelessDetector)detector).clone();					} catch (CloneNotSupportedException cnfe) {						detector = detectors[i]; // this shouldn't happen					}				}													try {					long start = 0, end;															if (TIMEDEBUG || DEBUG)  {						start = System.currentTimeMillis();						if (DEBUG) {							System.out.println("  running " + detector.getClass().getName());													}					}					detector.visitClassContext(classContext);										if (TIMEDEBUG || DEBUG) {						end = System.currentTimeMillis();						long delta = end - start;						entireClassAnalysisStart += delta;						if (delta > TIMEQUANTUM)							System.out.println("TIME: " + detector.getClass().getName() + " " + className + " " + delta);						if (DEBUG) {						String detectorName = detector.getClass().getName();						Long total = detectorTimings.get(detectorName);						if (total == null)							total = new Long(delta);						else							total = new Long(total.longValue() + delta);						detectorTimings.put(detectorName, total);						}					}				} catch (AnalysisException e) {					reportRecoverableDetectorException(className, detector, e);				} catch (ArrayIndexOutOfBoundsException e) {					reportRecoverableDetectorException(className, detector, e);				} catch (ClassCastException e) {					reportRecoverableDetectorException(className, detector, e);				}			}		} catch (ClassNotFoundException e) {			// This should never happen unless there are bugs in BCEL.			bugReporter.reportMissingClass(e);			reportRecoverableException(className, e);		} catch (ClassFormatException e) {			reportRecoverableException(className, e);		}		catch (RuntimeException re) {			RuntimeException annotatedEx;			try {				String sep = System.getProperty("line.separator");				Constructor<? extends RuntimeException> c = re.getClass().getConstructor(new Class[] { String.class });				String msg = re.getMessage();				msg = sep + "While finding bugs in class: " + className + ((msg == null) ? "" : (sep + msg));				annotatedEx = c.newInstance(new Object[] {msg});				annotatedEx.setStackTrace(re.getStackTrace());			} catch (Exception e) {				throw re;			}			throw annotatedEx;		}		if (TIMEDEBUG || DEBUG) {			long classSetupTime = System.currentTimeMillis() - entireClassAnalysisStart;			if (classSetupTime > TIMEQUANTUM)				System.out.println("TIME:  setup " + className + " " + classSetupTime); 		}		progressCallback.finishClass();	}