This tutorial will be very interesting. Last week I was working on a Java Project which requires me to have list of Classes from .jar file. With the help of JarEntry and JarInputStream utility I was able to extract all classes from inside of .jar file.

JarInputStream creates a new JarInputStream and reads the optional manifest. If a manifest is present, also attempts to verify the signatures if the JarInputStream is signed.

Below solution will also work for your if you have any of below query:

  • In Java – How to find a class somewhere inside dozens of JAR files
  • How to get names of classes inside a jar file?
  • Looking for a Java class in a set of JARs with find

Java Reflection Tutorial: How To Use Reflection To Call Java Method At Runtime

how-to-find-list-of-all-class-names-from-inside-jar-file

Let’s get started. We will perform below steps.

  1. Create class CrunchifyFindClassesFromJar.java
  2. Create utility method called getCrunchifyClassNamesFromJar(String jarFileName)
  3. Iterate through nextJarEntry and if found remove .class from name add it to JSON list
  4. Print JSONObject containing above class list
package com.crunchify.tutorial;

import java.io.FileInputStream;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;

import org.json.JSONArray;
import org.json.JSONObject;

/**
 * @author Crunchify.com
 * 
 */

public class CrunchifyFindClassesFromJar {

        @SuppressWarnings("resource")
        public static JSONObject getCrunchifyClassNamesFromJar(String crunchifyJarName) {
                JSONArray listofClasses = new JSONArray();
                JSONObject crunchifyObject = new JSONObject();
                try {
                        JarInputStream crunchifyJarFile = new JarInputStream(new FileInputStream(crunchifyJarName));
                        JarEntry crunchifyJar;

                        while (true) {
                                crunchifyJar = crunchifyJarFile.getNextJarEntry();
                                if (crunchifyJar == null) {
                                        break;
                                }
                                if ((crunchifyJar.getName().endsWith(".class"))) {
                                        String className = crunchifyJar.getName().replaceAll("/", "\\.");
                                        String myClass = className.substring(0, className.lastIndexOf('.'));
                                        listofClasses.put(myClass);
                                }
                        }
                        crunchifyObject.put("Jar File Name", crunchifyJarName);
                        crunchifyObject.put("List of Class", listofClasses);
                } catch (Exception e) {
                        System.out.println("Oops.. Encounter an issue while parsing jar" + e.toString());
                }
                return crunchifyObject;
        }

        public static void main(String[] args) {

                JSONObject myList = getCrunchifyClassNamesFromJar("/Users/<username>/Documents/javax.servlet.jsp.jar");
                System.out.println(myList);
        }
}

Result:

{
    "List of Class": [
        "javax.el.ArrayELResolver",
        "javax.el.BeanELResolver$BeanProperties",
        "javax.el.BeanELResolver$BeanProperty",
        "javax.el.BeanELResolver",
        "javax.el.CompositeELResolver$CompositeIterator",
        "javax.el.CompositeELResolver",
        "javax.el.ELContext",
        "javax.el.ELContextEvent",
        .....
        ..... so many more...
    ],
    "Jar File Name": "/Users/<username>/Documents/javax.servlet.jsp.jar"
}

Bonus point:

Check out how to find if particular jar contains specific method.

try {
        Class<?> crunchifyClass = Class.forName(className);
        Method main = crunchifyClass.getDeclaredMethod("yourMethodName");
        main.invoke(null);
} catch (Exception e) {
        e.printStackTrace();
}

Hope this mini utility will help if you want to quickly achieve the same goal. Feel free to use it in your production project.

The post In Java How to Find List of all Class Names from inside .jar File? – Jar Class Finder Utility with Java Reflection appeared first on Crunchify.