--- old/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderDataGraph.java 2017-06-23 19:12:19.096541556 -0400 +++ new/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderDataGraph.java 2017-06-23 19:12:18.842657996 -0400 @@ -27,6 +27,7 @@ import java.io.PrintStream; import java.util.*; import sun.jvm.hotspot.debugger.*; +import sun.jvm.hotspot.classfile.*; import sun.jvm.hotspot.runtime.*; import sun.jvm.hotspot.oops.*; import sun.jvm.hotspot.types.*; @@ -52,21 +53,43 @@ return ClassLoaderData.instantiateWrapperFor(headField.getValue()); } - public static interface KlassVisitor { + /** Lookup an already loaded class in any class loader. */ + public Klass find(String className) { + Symbol sym = VM.getVM().getSymbolTable().probe(className); + if (sym == null) return null; + for (ClassLoaderData cld = getClassLoaderGraphHead(); cld != null; cld = cld.next()) { + Klass k = cld.find(sym); + if (k != null) { + return k; + } + } + return null; + } + + /** Interface for iterating through all classes. */ + public static interface ClassVisitor { public void visit(Klass k); } - /** Iterate over all anonymous class loaders and the klasses in those */ - public void allAnonymousKlassesDo(final KlassVisitor v) { - for (ClassLoaderData cl = getClassLoaderGraphHead(); - cl != null; - cl = cl.next()) { - if (cl.getIsAnonymous() == true) { - for (Klass k = cl.getKlasses(); k != null; k = k.getNextLinkKlass()) { - v.visit(k); - } - } + /** Interface for iterating through all classes and their class + loaders in dictionary */ + public static interface ClassAndLoaderVisitor { + public void visit(Klass k, Oop loader); + } + + /** Iterate over all klasses - including object, primitive + array klasses */ + public void classesDo(ClassVisitor v) { + for (ClassLoaderData cld = getClassLoaderGraphHead(); cld != null; cld = cld.next()) { + cld.classesDo(v); } } + /** Iterate over all klasses - including object, primitive + array klasses, pass initiating loader. */ + public void allEntriesDo(ClassAndLoaderVisitor v) { + for (ClassLoaderData cld = getClassLoaderGraphHead(); cld != null; cld = cld.next()) { + cld.allEntriesDo(v); + } + } }