JavaEnterprise JavaUser Code: Method Finder

User Code: Method Finder

Developer.com content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More.

While learning Java, I often wished there was a convenient way to find
out the constructors, methods and fields of a given Java class. Java’s
documentation is very good, of course, but you have to follow many links
before you finally reach your destination. So I took some time out and
worked on a handy solution. The Method Finder is an application that
shows you the constructors, methods and fields of a class. It greatly
helped me. I hope it will do so for you, too.

Here’s the code:


/*  MethodFinder.java
 *  The method finder application
 *  developed by Kishore [kishorear@hotmail.com]
 */

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

/*
 *  The method finder class makes an instance
 *  of MainFram class and shows the frame
 */

public class MethodFinder
   {
     public static void main(String Args[])
       {  MainFrame f = new MainFrame();	

          f.setSize(560, 410);
          f.centreForm();
          f.setVisible(true);
       }			// end of main
   }				// end of MethodFinder class

and…


/*  Msgbox.java
 *  The method finder application
 */

import java.awt.*;
import java.awt.event.*;

/*  This class displays a custom message
 *  in a dialog box
 */

public class Msgbox extends Dialog 
   {  Msgbox(Frame f1, String prompt, String title)
        { 
          super(f1, title, true);
          setLayout(null);
          setResizable(false);          
          setBackground(SystemColor.control);

          // get width of prompt
          FontMetrics fm = getFontMetrics(getFont());
          int sw = fm.stringWidth(prompt);         

          setSize(sw + 50, 100);

          Dimension d = getSize();

          int a1 = (int) d.getWidth();
          int promptLeft = (a1 - sw) / 2;
           
          Label l1 = new Label();
          l1.setText(prompt);
          l1.setBounds(promptLeft, 30, sw, 20);
          add(l1);

	  Button b1 = new Button();
          b1.setLabel("OK");
          b1.setBounds(0, 0, 40, 20);  
         
          int a = (int) d.getWidth();
          int b = b1.getWidth();
          int c = (a - b) / 2;
          
          b1.setLocation(c, 60);
          
          b1.addActionListener(new ActionListener()
              {  public void actionPerformed(ActionEvent ae)
                   {  setVisible(false);
                   }
              });
           
          add(b1); 

          addWindowListener(new WindowAdapter()
             {  public void windowClosing(WindowEvent we)
                  {   setVisible(false);
                  }
              });
          
          centreForm(); 
          setVisible(true);          
        } 	// End of constructor	

     public void centreForm()
        { Toolkit tkMsg = getToolkit();
          Dimension dimScreen = tkMsg.getScreenSize();
          Dimension dimDialog = getSize();
          int left = (int) (dimScreen.getWidth() - dimDialog.getWidth()) / 2;
          int top = (int) (dimScreen.getHeight() - dimDialog.getHeight()) / 2;
          setLocation(left, top);
        }	// End of centreForm

   }		// End of class

and…


/*  MainFrame.java
 *  The method finder application
 */

import java.awt.*;
import java.awt.event.*;
import java.lang.reflect.*;
import java.awt.datatransfer.*;

/* This class does most of the work of
 * Method Finder. 
 */

class MainFrame extends Frame
   { 
     final int     HIST_COUNT     = 10;
     Choice        chsTypes       = new Choice();	// Choice to select types (constructors, fields, methods)
     TextField     txtClass       = new TextField();	// TextField where user types the name of class
     List          lstValues      = new List();		// List which displays then Constructors, methods or fields
     TextArea      txtFullString  = new TextArea();	// TextArea which displays Description
     Method        myMethods[];				// Method array which holds info about methods of the class
     Field         myFields[];				// Field array which holds info about fields
     Constructor   myConstructors[];			// Constructor array which holds info about constructors
     Button        btnClose;     			// Button which closes the frame
     Button	   btnHelp;				// Button which shows help when clicked
     Checkbox      chkShowDeclaration;			// Checkbox which helps user to switch between actual declaration 
                                                        // and description of method
     PopupMenu     pm;
     String        arrHistory[]   = new String[HIST_COUNT];
     int           currentHist    = 0; 
     Button        btnHistory;
     PopupMenu     pmHistory;

     MainFrame()			
       { super("Method Finder");
         setLayout(null);
         setResizable(false);
         setBackground(SystemColor.control); 	 

         // add first label 
         Label l1 = new Label("Enter a Java Class (like java.awt.Dimension) and press Enter.");
         l1.setBounds(20, 30, 450, 20);         
         add(l1);
         
         // add txtClass
	 txtClass.setBounds(20, 50, 400, 20);
         add(txtClass);
         
         // add btnHistory
         btnHistory = new Button("  /");
         btnHistory.setBounds(400, 50, 50, 20);
         add(btnHistory);
         
         
         // add second label
         Label l2 = new Label("Select an item from the list.");
         l2.setBounds(20, 70, 450, 20);
         add(l2);         
         
         // add chstypes
         chsTypes.setBounds(20, 90, 450, 20); 
         chsTypes.add("Constructers");
         chsTypes.add("Methods");
         chsTypes.add("Fields");
	 add(chsTypes);

         // add next label 'Members'
         Label l3 = new Label("Members");
         l3.setBounds(20, 120, 450, 20);
         add(l3);            

         // add lstValues 
         lstValues.setBounds(20, 140, 450, 100);
         add(lstValues);

         // add label 'Description'
         Label l4 = new Label("Description");
         l4.setBounds(20, 250, 450, 20);
         add(l4);

         // add txtFullString                  
         txtFullString.setBounds(20, 270, 450, 100);
         add(txtFullString);   

         // add Close button
         btnClose = new Button("Close");
         btnClose.setBounds(480, 50, 60, 20);
         add(btnClose);
	
	 // add Help button
	 btnHelp = new Button("Help");
	 btnHelp.setBounds(480, 90, 60, 20);
	 add(btnHelp);
	 
	 // add check box 'Show Actual Declaration'
         chkShowDeclaration = new Checkbox("Show Actual Declaration in Description",false);
         chkShowDeclaration.setBounds(20, 380, 450, 20);
         add(chkShowDeclaration);          
         chkShowDeclaration.setEnabled(false);

	 // add popup menu to lstValues
         pm = new PopupMenu();
         MenuItem mnuZoom = new MenuItem("Zoom...");
         MenuItem mnuCopy = new MenuItem("Copy");
         pm.add(mnuZoom);
         pm.add(mnuCopy);



	 // actionperfomed event mnuCopy (copy to clipboard)
         mnuCopy.addActionListener(new ActionListener()
            {
              public void actionPerformed(ActionEvent ae)
                { 
                  StringSelection ss = new StringSelection(lstValues.getSelectedItem());
                  Toolkit tk = getToolkit();
                  Clipboard cp = tk.getSystemClipboard();
                  cp.setContents(ss, ss);                  
                }
             });
         
         mnuZoom.addActionListener(new ActionListener()
             {
             	public void actionPerformed(ActionEvent ae)
             	 { 
             	   zoomClass();
             	 }
              });

         lstValues.add(pm);  

         // mouse released event of lstValues
         lstValues.addMouseListener(new MouseAdapter()
           {   public void mouseReleased(MouseEvent me)
                  {  
                     // if right button is clicked
                     // and at lstValues has at least one item	
                     if (me.isPopupTrigger() && lstValues.getItemCount() !=0)
                       { 
                         Label tmpLbl = new Label();
                         add(tmpLbl);
                         tmpLbl.add(pm);
                         pm.show(tmpLbl, me.getX() + lstValues.getX(), me.getY() + lstValues.getY());
                       }
                  }
           });
       
         // actionPerformed event of lstValues
         lstValues.addActionListener(new ActionListener()
           {
             public void actionPerformed(ActionEvent ae)
               {
               	 zoomClass();
               }
           });
           
         // add History popup menu
         pmHistory = new PopupMenu();
         pmHistory.addActionListener(new ActionListener()
            {  
            	public void actionPerformed(ActionEvent ae)
            	  {
            	  	txtClass.setText(ae.getActionCommand());
            	  	fillItems();
            	  }
            });
         
         btnHistory.addActionListener(new ActionListener()
             {
             	public void actionPerformed(ActionEvent ae)
             	  {  
             	     Label lbl1 = new Label("lbl1");
             	     add(lbl1);
             	     lbl1.add(pmHistory);
             	     
             	     // add menuitems to pmHistory
             	     pmHistory.removeAll();
             	     //for(int i=0; i=0; i--)
             	        { 
             	          pmHistory.add(arrHistory[i]);
             	        }
                     
             	     int x = btnHistory.getX();
             	     int y = btnHistory.getY() + btnHistory.getHeight();
             	     pmHistory.show(lbl1, x, y);
             	   }
             });
             
         
         // action performed event of txtClass
         txtClass.addActionListener(new ActionListener()
            {  public void actionPerformed(ActionEvent ae) 
                {  fillItems();
                }    
            });

         // item state changed event of chsTypes 
         chsTypes.addItemListener(new ItemListener()
            {  public void itemStateChanged(ItemEvent ie)
                {  fillItems();
                }
            });     

         // item changed event of LstValues
         lstValues.addItemListener(new ItemListener()
            {  public void itemStateChanged(ItemEvent ie)
                {  displayFullText();
                }
            });

         // window closing event
         addWindowListener(new WindowAdapter()
           {  public void windowClosing(WindowEvent we)
                 {  System.exit(0);
                 }
           });

         // action performed event of btnClose
         btnClose.addActionListener(new ActionListener()
           {  public void actionPerformed(ActionEvent ae)
                 { System.exit(0);
                 }
           });

	 // action performed event of btnHelp
	 btnHelp.addActionListener(new ActionListener()
	   {
	     public void actionPerformed(ActionEvent ae)
	         {
	           HelpFrame helpFrame = new HelpFrame(MainFrame.this, "Help.txt");
	           helpFrame.showHelp();
	         }
	    });
	 
         // item state changed event of chkShowDeclaration 
         chkShowDeclaration.addItemListener(new ItemListener()
           {  public void itemStateChanged(ItemEvent ie)
                 { displayFullText();
                 }
           });  
       }				// End of Sample frame constructer
     private void fillItems()
       {
          try
            { 
               txtFullString.setText(" ");
               
               // trim txtClass
               txtClass.setText(txtClass.getText().trim());
 
               // exit if class name is blank 
               if (txtClass.getText().equals(" ") || txtClass.getText().equals(""))
                    return;
               
               // set cursor to hourglass
               setCursor(new Cursor(Cursor.WAIT_CURSOR));               
          
               Class c;
               c = Class.forName(txtClass.getText());
              
               switch (chsTypes.getSelectedIndex())
                 { case 0:  		// Fill Constructers
                     { 
                         // add constructers to list
                         lstValues.removeAll();         
	                 myConstructors = c.getConstructors();
                         for(int i = 0; i < myConstructors.length; i++)
                             lstValues.add(" " + myConstructors[i].getName());

                         break;
                     }			
	           case 1:		// Fill Methods
                     {
                        // add methods to list
                        lstValues.removeAll();
                        myMethods = c.getMethods();
                        for(int i=0; i < myMethods.length; i++)
                            lstValues.add(" " + myMethods[i].getName());

                        break;
                     } 			
                   case 2:		// Fill fields
                     {
                       // add fields to list 
                       lstValues.removeAll();
                       myFields = c.getFields();
                       for (int i=0; i < myFields.length; i++)
                           lstValues.add(" " + myFields[i].getName());
                       //prevChkValue = chkShowDeclaration.getState(); 

                       break;   
                     } 			
                 }			// end of switch
                 
               
               // select first item from lstValues
               if (lstValues.getItemCount() > 0)
                  {   
                    lstValues.select(0);
                    displayFullText();
                    chkShowDeclaration.setEnabled(true);  
                  } 
               else
                    chkShowDeclaration.setEnabled(false);
               
               
               // add to history array
               addToHistory();
               
               setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
  
            } catch (ClassNotFoundException e)	// catch class not found exception
                 { 
                   lstValues.removeAll();   
                   txtFullString.setText(" ");
                   chkShowDeclaration.setEnabled(false);
                   Msgbox m1 = new Msgbox(this, "Invalid Class Name", "Method Finder");
                   setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
                 }
              catch (Exception e)		// catch other exceptions
                 {
                   lstValues.removeAll();   
                   txtFullString.setText(" ");
                   chkShowDeclaration.setEnabled(false);
                   Msgbox m1 = new Msgbox(this, "Error" + e, "Method Finder");
                   setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
                 }
             
       }   				// end of fill items

     private void displayFullText()
       {    
           switch (chsTypes.getSelectedIndex())
             {   case 0:		// constructors
                    {   Constructor tmpCon = myConstructors[lstValues.getSelectedIndex()];
                        if (chkShowDeclaration.getState())
                            txtFullString.setText(" " + tmpCon);
                        else
                            displayConstructorInfo(tmpCon); 
                        break;
                    }
                 case 1:		// methods
                    {   Method tmpMet = myMethods[lstValues.getSelectedIndex()];
                        if (chkShowDeclaration.getState())
                            txtFullString.setText(" " + tmpMet);
                        else
                            displayMethodInfo(tmpMet);
                        break;
                    } 
                 case 2:		// fields
                    {   Field tmpFie = myFields[lstValues.getSelectedIndex()];
                        if (chkShowDeclaration.getState())
                            txtFullString.setText(" " + tmpFie);
                        else
                            displayFieldInfo(tmpFie);
                        break;
                    }     
             }				// end of switch
       }				// end of displayFullText

     private void displayConstructorInfo(Constructor tmpCon)
       {  
          // get name of constructor
          //String desc = "Name : " + tmpCon.getName();

          // get parameters of constructor
          String desc = "Parameters :- n";
          Class p[] = tmpCon.getParameterTypes();
          for (int i=0; i < p.length; i++)
             desc += "t" + p[i] + "n";

          // get modifiers
          desc += "Modifiers :-n";
          int x = tmpCon.getModifiers();
          desc += getModifierString(x); 

          // get exception types
          desc += "Exception Types :-n";
          Class e[] = tmpCon.getExceptionTypes();
          for (int i=0;  i < e.length; i++)
             desc += "t" + e[i] + "n"; 

          // display information
          txtFullString.setText(desc);
       }           			// end of displayConstructorInfo

     private void displayMethodInfo(Method tmpMet)
       {  
          // get parameter types of method
          String desc = "Parameters :-n";
          Class p[] = tmpMet.getParameterTypes();
          for (int i=0; i < p.length; i++)
             desc += "t" + p[i] + "n";

          // get return type
          desc += "Return Type :-nt" + tmpMet.getReturnType() + "n"; 

          // get modifiers
          desc += "Modifiers :-n";
          int x = tmpMet.getModifiers();
          desc += getModifierString(x);

          // get exception types
          desc += "Exception Types :-n";
          Class e[] = tmpMet.getExceptionTypes();
          for (int i=0;  i < e.length; i++)
             desc += "t" + e[i] + "n"; 
          
          // display information
          txtFullString.setText(desc);            
       }				// end of displayMethodInfo
    
     private void displayFieldInfo(Field tmpField)
       {  String desc;

          // get modifiers
          desc = "Modifiers :-n";
          int x = tmpField.getModifiers();
          desc += getModifierString(x);          

          // display information
          txtFullString.setText(desc);
       }				// end of displayFieldInfo
     
     private String getModifierString(int x)
       {  String strModifier = "";

          if (Modifier.isAbstract(x))		// abstract
             strModifier += "tabstractn";

          if (Modifier.isFinal(x))		// final
             strModifier += "tfinaln";

          if (Modifier.isInterface(x))		// interface
             strModifier += "tinterfacen";

          if (Modifier.isNative(x))		// native
             strModifier += "tnativen";

          if (Modifier.isPrivate(x))		// private
             strModifier += "tprivaten";

          if (Modifier.isProtected(x))		// protected
             strModifier += "tprotectedn";

          if (Modifier.isPublic(x))		// public
             strModifier += "tpublicn";

          if (Modifier.isStatic(x))		// static
             strModifier += "tstaticn";

          if (Modifier.isStrict(x))		// strict
             strModifier += "tstrictn";

          if (Modifier.isSynchronized(x))	// synchronized
             strModifier += "tsynchronizedn";

          if (Modifier.isTransient(x))		// transient
             strModifier += "ttransientn";

          if (Modifier.isVolatile(x))		// volatile
             strModifier += "tvolatilen";

          return(strModifier);
       }				// end of getModifierString
       
     public void addToHistory()
       {  boolean existing = false;
          
          // check if existing
       	  for(int i=0; i= HIST_COUNT)
       	        {   
       	            for(int i=0; i < (HIST_COUNT-1); i++)
       	               arrHistory[i] = arrHistory[i+1];

       	            currentHist--;
       	      	}
       	      
       	      arrHistory[currentHist++] = txtClass.getText();
       	    }	     	      
       }				// end of addToHistory

     private void zoomClass()
      {
        String zoomText = "nClass :- nt" + txtClass.getText();
        zoomText += "nMember :- nt" + lstValues.getSelectedItem();
        zoomText += "n" + txtFullString.getText();
        ZoomFrame zf = new ZoomFrame(MainFrame.this, zoomText);
        zf.zoom();
       }
      	
       	
     public void centreForm()
       {  
          Toolkit tkMsg = getToolkit();
          Dimension dimScreen = tkMsg.getScreenSize();
          Dimension dimDialog = getSize();
          int left = (int) (dimScreen.getWidth() - dimDialog.getWidth()) / 2;
          int top = (int) (dimScreen.getHeight() - dimDialog.getHeight()) / 2;
          setLocation(left, top);
       }				// End of centreForm

   }            			// end of MainFrame class 

plus...


import java.awt.*;
import java.awt.event.*;
import java.io.FileInputStream;

public class HelpFrame extends Frame 
  { private TextArea txtDesc;		// TextArea which displays contents of help.txt 
    final int INDENT = 25;		// set top margin
    private byte readBytes[];		// holds the bytes read from help.txt
    
    public HelpFrame(Frame frm, String fileName)
      {  super("Help");		// call constructor of dialog
         setLayout(new BorderLayout());
         setBackground(SystemColor.control);
	 setSize(400, 400);
	 centreForm();
	 
	 try
	  {		 
	    // read from help.txt
            FileInputStream fHelp = new FileInputStream(fileName);
            int totBytes = fHelp.available();
            readBytes = new byte[totBytes];
            fHelp.read(readBytes, 0, totBytes);
            fHelp.close();
            
            String s1 = "";            
            txtDesc = new TextArea("", 0, 0 , TextArea.SCROLLBARS_VERTICAL_ONLY);
            
            // pass bytes to txtDesc
            for (int i=0; i<totBytes; i++)
             {
             	s1 += (char) readBytes[i];
             }
            
            txtDesc.setText(s1);
            
          } catch (Exception e)
             {
             	System.out.println(" " + e);
             }
         	 
         txtDesc.setEditable(false);
         add(txtDesc, BorderLayout.CENTER);
                
         addWindowListener(new WindowAdapter()
           {
             public void windowClosing(WindowEvent we)
               { 
               	setVisible(false);
               }
           });          
       }
       
    public void zoom()
       { 
       	setVisible(true);
       }
       
    private void centreForm()
       {  
          Toolkit tkMsg = getToolkit();
          Dimension dimScreen = tkMsg.getScreenSize();
          Dimension dimDialog = getSize();
          int left = (int) (dimScreen.getWidth() - dimDialog.getWidth()) / 2;
          int top = (int) (dimScreen.getHeight() - dimDialog.getHeight()) / 2;
          setLocation(left, top);
       }				// End of centreForm
    
    public void showHelp()
       {
       	  setVisible(true);
       }
}

and finally...


/*  Msgbox.java
 *  The method finder application
 */

import java.awt.*;
import java.awt.event.*;

public class ZoomFrame extends Frame
  { TextArea txtDesc; 
    final int INDENT = 25;

    public ZoomFrame(Frame frm, String s1)
      {  super("Zoom");
         setLayout(new BorderLayout());
         setBackground(SystemColor.control);
	 setSize(400, 400);
	 centreForm();
	 
         txtDesc = new TextArea("", 0, 0 , TextArea.SCROLLBARS_VERTICAL_ONLY);
         txtDesc.setText(s1);
         add(txtDesc, BorderLayout.CENTER);
                
         addWindowListener(new WindowAdapter()
           {
             public void windowClosing(WindowEvent we)
               { 
               	setVisible(false);
               }
           });
       
           
       }
       
    public void zoom()
       { 
       	setVisible(true);
       }
       
     private void centreForm()
       {  
          Toolkit tkMsg = getToolkit();
          Dimension dimScreen = tkMsg.getScreenSize();
          Dimension dimDialog = getSize();
          int left = (int) (dimScreen.getWidth() - dimDialog.getWidth()) / 2;
          int top = (int) (dimScreen.getHeight() - dimDialog.getHeight()) / 2;
          setLocation(left, top);
       }				// End of centreForm
       
}

Downloads

Download source files = 24K

JAR file = 17K

About the Author

Kishore Ar works for Thomson Cyber Solutions Pvt. Ltd, Trivandrum,
Kerala, India as a senior programmer. He says that programming is his
profession and hobby. He has been involved in many projects, both Web-based
and client/server, for the last four years especially designing and
developing database projects using Java, Visual Basic 6, and
Oracle 8i. He can be contacted at kishorear@hotmail.com.

[To contribute a code article to Gamelan, please contact
kmurphy@internet.com.]

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends & analysis

Latest Posts

Related Stories