Reflection : Javap Command Working With Example Java Program Code

Javap Command gives overview of the class file . It is also called java class disassembler.
It gives the information depending upon the options used by the user .

1. Programmer NOT providing any helper option with javap command

Results in javap command shows all the package,public and protected fields and methods of the classes passed . We can also make the similar program with the help of reflection . Reflection is one of the core features of java allowing access to the Class class object .

javap command example without using options  :

Compile the following class JavapExample


public class JavapExample {

  String firstname ;
  String lastname ;
  
  public  void printName(){
   System.out.println("Full name of the candidate is " + firstname + lastname);
  }
 
  public void printNameUSAformat(){
   System.out.println("Full name of the candidate in reverse is " + lastname + firstname);
  }
}
  
The output from javap  JavapExample.class  will be :

Compiled from "JavapExample.java"

public class JavapExample extends java.lang.Object {
  java.lang.String firstname;
  java.lang.String lastname;
  public JavapExample();
  public void printName();
  public void printNameUSAformat();

}


2. Other options Programmer has for the javap command are as follows :

 -help : it will print the help messages to the user

 -l :  it print out all the local and line variables of the table

 -public : it only prints the public members and classes

 -protected : it only prints the protected and public members and classes .

 -c : it print out the disassembled code

 -j : flag is directly pass to the runtime

 -s : outputs the internal type signature


javap command example using options  :

Compile the following class JavapExample


public class JavapExample {

  String firstname ;
  String lastname ;
  
  public  void printName(){
   System.out.println("Full name of the candidate is " + firstname + lastname);
  }
 
  public void printNameUSAformat(){
   System.out.println("Full name of the candidate in reverse is " + lastname + firstname);
  }
}
  
The output from javap -public JavapExample.class will  be :

Compiled from "JavapExample.java"

public class JavapExample extends java.lang.Object   {
  public JavapExample();
  public void printName();
  public void printNameUSAformat();

}


Here in below code we use forName() and other reflection methods ,

But the most important question arises

What is the difference between forName() method , Class.getClass() method . Why there are two different names as  both have almost same functionality .

Actually there is very minute difference , forName() loads and initializes the class while object.getClass() returns the class object loaded into the permgen space .

You can find the javap.exe  in the bin directory  of the jdk not in jre.
For java 1.6 the path is
  jdk1.6.0_20\bin\javap.exe

So in short we use  javap command to read the bytecodes .

For more info about javap :  http://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/javap.html



Demo for Java inbuilt functionality of  javap command when you type on console


javap command example java program source code output image



After running this program the output will be look like this :



output of the javap command in java








Code :


import java.lang.reflect.*;
import java.awt.*;
import java.io.*;

public class Javap
{
    public static void printStart(String s)
    {
        System.out.println("Compiled from  "+s );
        try
        {
            Class c=Class.forName(s);
            int m=c.getModifiers();
            printModifier(m);
            System.out.print(" class "+s+"  ");
        }
        catch(Exception e){}
    }
    
    public static void printModifier(int m)
    {
        if(Modifier.isPublic(m))
        System.out.print("public ");
        if(Modifier.isStatic(m))
        System.out.print("static ");
        if(Modifier.isAbstract(m))
        System.out.print("abstract ");
        if(Modifier.isFinal(m))
        System.out.print("final ");
    }
    
    public static void printSuperClass(String s)
    {
        try
        {
            Class subclass=Class.forName(s);
            Class superclass=subclass.getSuperclass();
            System.out.print("extends "+superclass.getName()+" ");
        }
        catch(Exception e){}
    }
    
    
    public static void printInterface(String s)
    {
        try
        {
            Class c=Class.forName(s);
            Class inter[]=c.getInterfaces();
            System.out.print("implements ");
            for(int i=0;i<inter.length;i++)
            {
                System.out.print(inter[i].getName());
                System.out.print(", ");
            }
            System.out.println(" ");
            System.out.println(" { ");
            }
            catch(Exception e)  {}
        }
        
        public static void printField(String s)
        {
            try
            {
                Class c=Class.forName(s);
                Field f[]=c.getFields();
                for(int i=0;i<f.length;i++)
                {
                    int m=f[i].getModifiers();
                    printModifier(m);
                    System.out.print(" ");
                    Class type=f[i].getType();
                    System.out.print(type.getName());
                    System.out.println(" "+f[i].getName());
                }
            }
            catch(Exception e)  {}
        }
        
        
        public static void printConstructor(String s)
        {
            try
            {
                Class c=Class.forName(s);
                Constructor cs[]=c.getConstructors();
                for(int i=0;i<cs.length;i++)
                {
                    int m=cs[i].getModifiers();
                    printModifier(m);
                    System.out.print (c.getName()+"(");
                    Class type[]=cs[i].getParameterTypes();
                    for(int k=0;k<type.length;k++)
                    {
                        System.out.print(type[k].getName()+",");
                    }
                    System.out.print(")");
                    System.out.println(" ");
                }
            }
            catch(Exception e){}
        }
        
        
        
        
        public static void printMethods (String s)
        {
            try
            {
                Class c=Class.forName(s);
                Method m[]=c.getMethods();
                for(int i=0;i<m.length;i++)
                {
                    int m1=m[i].getModifiers();
                    printModifier(m1);
                    System.out.print(m[i].getReturnType().getName());
                    System.out.print(" "+m[i].getName());
                    System.out.print("(");
                    Class type[]=m[i].getParameterTypes();
                    for(int k=0;k<type.length;k++)
                    {
                        System.out.print(type[k].getName()+",");
                    }
                    System.out.print(")");
                    System.out.println(" ");
                }
            }
            catch(Exception e){}
            
        }
        
        
        
        
        public static void main(String s[])
        {
            
            printStart(s[0]);
            printSuperClass(s[0]);
            printInterface(s[0]);
            printField(s[0]);
            printConstructor(s[0]);
            printMethods(s[0]);
        System.out.print("} ");
    }
    
}

About The Author

Subham Mittal has worked in Oracle for 3 years.
Enjoyed this post? Never miss out on future posts by subscribing JavaHungry