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.
- Create class
CrunchifyFindClassesFromJar.jar
- Create utility method called
getCrunchifyClassNamesFromJar(String jarFileName)
- Iterate through nextJarEntry and if found remove .class from name add it to json list
- 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.
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