Like a human thinking about his/her own thinking, the process of a running program examining its classes is called reflection or introspection.
There is run-time information about classes that you can access.
The central class representing this information is
java.lang.Class, a class confusingly named Class.
getClass() method to get a Class object
Every class has the class Object as an
ancestor. A reflection method in the Object class is
getClass(), which returns the Class of that object.
java.lang.Class has two useful methods: getName()
for getting a string name of the class and
getSuperclass() for getting the Class object
of the parent class, or null if this is the
Object class. For example,
String s = "abc"; Class cls; cls = s.getClass(); // Represents the String class. System.out.println(cls.getName()); // Prints "java.lang.String"
I wanted to know the type returned by the
JFrame getContentPane() method. The documenation
says it returns a Container object, but that
only means that it returns Container or a
subclass of Container. This program
prints the inheritance hierarchy for any object.
// Introspect.java -- Fred Swartz -- 2003.05.04
import java.awt.*;
import javax.swing.*;
import java.util.ArrayList;
class Introspect {
//====================================================== method main
public static void main(String[] args) {
JFrame f = new JFrame();
Container c = f.getContentPane();
System.out.println("Content pane inheritance hierarchy");
printAncestors(c);
LayoutManager lm = c.getLayout();
System.out.println("\n\nLayout for content pane inheritance hierarchy");
printAncestors(lm);
System.out.println("\n\nDefault JPanel layout inheritance hierarchy");
printAncestors((new JPanel()).getLayout());
}// end main
//============================================ method printAncestors
private static void printAncestors(Object obj) {
ArrayList ancestors = getAncestorList(obj);
for (int i=ancestors.size()-1; i>=0; i--) {
Class cls = (Class)ancestors.get(i);
System.out.println(" " + cls.getName());
}
}//end printAncestors
//=========================================== method getAncestorList
private static ArrayList getAncestorList(Object obj) {
ArrayList result = new ArrayList();
result.add(obj.getClass());
for (Class parent=obj.getClass().getSuperclass();
parent != null;
parent = parent.getSuperclass()) {
result.add(parent);
}
return result;
}//end getAncestorList
}//end class
The output from this program is
Content pane inheritance hierarchy java.lang.Object java.awt.Component java.awt.Container javax.swing.JComponent javax.swing.JPanel Layout for content pane inheritance hierarchy java.lang.Object java.awt.BorderLayout javax.swing.JRootPane$1 Default JPanel layout inheritance hierarchy java.lang.Object java.awt.FlowLayout