Search code examples
java.class-file

Java binary (.class) file format parser?


I am looking for a tool (or chain of tools) that can parse a .class files to a Java object. Something like :

JavaClass parsed = myTool.parse("/some_folder/SomeClassFile.class");

The parsed object would have methods like :

List<JavaMethod> methods = parsed.getMethods();
List<JavaInterface> interfaces = parsed.getImplementedInterfaces();
List<JavaMethod> calls = someMethod.getCalls();

My constraints are :

  1. The aim is to parse all classes of a project, including jars, so performance does matter.
  2. The parser has to parse Java 8 .class files
  3. Java is my main language so it's better for me if it's in Java.

Of course I can do some coding, so for example if the output is xml it's ok.

So here are the options I have found so far - none being satisfying as it is :

  1. BCEL or ASM look like a weapon of choice, but they also look like they're not maintained anymore. Besides, they're a little overkill for my purpose.
  2. Elipse AST would work, but from what I saw it's only for source files, and I need to parse binary files (jars...)
  3. A grammar for a parsing engine like antlr, yacc, bison... would work, but I have yet to find a reference grammar for .class files ! Besides, antlr is for text files, and I don't know of another reference Java parser engine (as I said, I would like a Java tool better).
  4. I first thought a class loader would do the job, and that I could just load the class and then use reflection. But actually I realized I need stuff that the Java reflection api doesn't provide, like getting calls from a particular method.

So here is where I am now ! Thanks in advance for your help !


Solution

  • I'd recommend ASM. From what I've seen, it's by far the most popular Java bytecode library, and yes, it is still maintained. At time of writing, it looks like the most recent change was 41 days ago. So it's not constantly churning but it's not like it's abandoned either. And with such a commonly used library, support should be easy to find.