How to find which jars and in what order are loaded by a classloader?

后端 未结 4 1134
离开以前
离开以前 2020-12-12 20:37

I could not find a clear answer to this question elsewhere, so I\'ll try here:

Is there some way (programmatic or other) to get a list of JARs/classes loaded by an A

4条回答
  •  庸人自扰
    2020-12-12 21:31

    As an alternative way, you can use this code snippet. The result is a file that consist of related jar files to a class-loader and class files that are loaded by an object's class-loaders (chain of class-loaders including its parents until root class-loader). Class-loaders are seperated by stars.

    Object obj = this;
    ClassLoader classLoader = obj.getClass().getClassLoader();
    File file = new File("classlodersClassesJars.txt");
    if(file.exists()) {
        file.delete();
    }
    if(classLoader != null) { // to escape from system classes that are loaded by bootstrap class-loader such as String.
        do {
            try {
                Class clClass = classLoader.getClass();
                while(clClass != ClassLoader.class){
                        clClass = clClass.getSuperclass();
                }
                java.lang.reflect.Field domainField = clClass.getDeclaredField("domains");
                java.lang.reflect.Field classesField = clClass.getDeclaredField("classes");
                domainField.setAccessible(true);
                classesField.setAccessible(true);
                HashSet domains = (HashSet) domainField.get(classLoader);
                Vector classes = (Vector) classesField.get(classLoader);
                FileOutputStream fos = new FileOutputStream("classlodersClassesJars.txt", true);
                fos.write(("\n******************** " + classLoader.toString() + "\n").getBytes());
                fos.write(Arrays.toString(classes.toArray()).getBytes());
                Object[] reverseDomains = domains.toArray();
                org.apache.commons.lang.ArrayUtils.reverse(reverseDomains);
                fos.write(Arrays.toString(reverseDomains).getBytes());
                fos.close();
                classLoader = classLoader.getParent();
            } catch (Exception exception) {
                exception.printStackTrace();
                // TODO
            }
        } while (classLoader.getParent() != null);
    }
    

提交回复
热议问题