Quantcast
Channel: Crunchify
Viewing all articles
Browse latest Browse all 1037

In Java How to Find List of all Class Names from inside .jar File? – Jar Class Finder Utility

$
0
0

Java find Classes from inside Jar In Java How to Find List of all Class Names from inside .jar File?   Jar Class Finder Utility

This one 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.

You may have any of below queries. Below solution will work for your need.

  • java – 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

Another must read:

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

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

  1. Create class CrunchifyFindClassesFromJar.jar
  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",
        "javax.el.ELContextListener",
        "javax.el.ELException",
        "javax.el.ELResolver",
        "javax.el.ELUtil$1",
        "javax.el.ELUtil",
        "javax.el.Expression",
        "javax.el.ExpressionFactory",
        "javax.el.FactoryFinder",
        "javax.el.FunctionMapper",
        "javax.el.ListELResolver",
        "javax.el.MapELResolver",
        "javax.el.MethodExpression",
        "javax.el.MethodInfo",
        "javax.el.MethodNotFoundException",
        "javax.el.PropertyNotFoundException",
        "javax.el.PropertyNotWritableException",
        "javax.el.ResourceBundleELResolver",
        "javax.el.ValueExpression",
        "javax.el.ValueReference",
        "javax.el.VariableMapper",
        "javax.servlet.jsp.el.ELException",
        "javax.servlet.jsp.el.ELParseException",
        "javax.servlet.jsp.el.Expression",
        "javax.servlet.jsp.el.ExpressionEvaluator",
        "javax.servlet.jsp.el.FunctionMapper",
        "javax.servlet.jsp.el.ImplicitObjectELResolver$1",
        "javax.servlet.jsp.el.ImplicitObjectELResolver$EnumeratedMap",
        "javax.servlet.jsp.el.ImplicitObjectELResolver$ImplicitObjects$1",
        "javax.servlet.jsp.el.ImplicitObjectELResolver$ImplicitObjects$2",
        "javax.servlet.jsp.el.ImplicitObjectELResolver$ImplicitObjects$3",
        "javax.servlet.jsp.el.ImplicitObjectELResolver$ImplicitObjects$4",
        "javax.servlet.jsp.el.ImplicitObjectELResolver$ImplicitObjects$5",
        "javax.servlet.jsp.el.ImplicitObjectELResolver$ImplicitObjects$6",
        "javax.servlet.jsp.el.ImplicitObjectELResolver$ImplicitObjects$7",
        "javax.servlet.jsp.el.ImplicitObjectELResolver$ImplicitObjects$8",
        "javax.servlet.jsp.el.ImplicitObjectELResolver$ImplicitObjects$9",
        "javax.servlet.jsp.el.ImplicitObjectELResolver$ImplicitObjects",
        "javax.servlet.jsp.el.ImplicitObjectELResolver",
        "javax.servlet.jsp.el.ScopedAttributeELResolver",
        "javax.servlet.jsp.el.VariableResolver",
        "javax.servlet.jsp.ErrorData",
        "javax.servlet.jsp.HttpJspPage",
        "javax.servlet.jsp.JspApplicationContext",
        "javax.servlet.jsp.JspContext",
        "javax.servlet.jsp.JspEngineInfo",
        "javax.servlet.jsp.JspException",
        "javax.servlet.jsp.JspFactory",
        "javax.servlet.jsp.JspPage",
        "javax.servlet.jsp.JspTagException",
        "javax.servlet.jsp.JspWriter",
        "javax.servlet.jsp.PageContext",
        "javax.servlet.jsp.SkipPageException",
        "javax.servlet.jsp.tagext.BodyContent",
        "javax.servlet.jsp.tagext.BodyTag",
        "javax.servlet.jsp.tagext.BodyTagSupport",
        "javax.servlet.jsp.tagext.DynamicAttributes",
        "javax.servlet.jsp.tagext.FunctionInfo",
        "javax.servlet.jsp.tagext.IterationTag",
        "javax.servlet.jsp.tagext.JspFragment",
        "javax.servlet.jsp.tagext.JspIdConsumer",
        "javax.servlet.jsp.tagext.JspTag",
        "javax.servlet.jsp.tagext.PageData",
        "javax.servlet.jsp.tagext.SimpleTag",
        "javax.servlet.jsp.tagext.SimpleTagSupport",
        "javax.servlet.jsp.tagext.Tag",
        "javax.servlet.jsp.tagext.TagAdapter",
        "javax.servlet.jsp.tagext.TagAttributeInfo",
        "javax.servlet.jsp.tagext.TagData",
        "javax.servlet.jsp.tagext.TagExtraInfo",
        "javax.servlet.jsp.tagext.TagFileInfo",
        "javax.servlet.jsp.tagext.TagInfo",
        "javax.servlet.jsp.tagext.TagLibraryInfo",
        "javax.servlet.jsp.tagext.TagLibraryValidator",
        "javax.servlet.jsp.tagext.TagSupport",
        "javax.servlet.jsp.tagext.TagVariableInfo",
        "javax.servlet.jsp.tagext.TryCatchFinally",
        "javax.servlet.jsp.tagext.ValidationMessage",
        "javax.servlet.jsp.tagext.VariableInfo"
    ],
    "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.

Have anything to add to this article? Please chime in and join the conversion.


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


Viewing all articles
Browse latest Browse all 1037

Trending Articles