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