Reflection Java Tutorial

/*
 *     file: DynamicTypeChecking.java
 *  package: oreilly.hcj.reflection
 *
 * This software is granted under the terms of the Common Public License,
 * CPL, which may be found at the following URL:
 * http://www-124.ibm.com/developerworks/oss/CPLv1.0.htm
 *
 * Copyright(c) 2003-2005 by the authors indicated in the @author tags.
 * All Rights are Reserved by the various authors.
 *
 ########## DO NOT EDIT ABOVE THIS LINE ########## */
import java.io.Serializable;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
/**
 * Demonstrates Dynamic class type checking.
 * 
 * @author Robert Simmons jr. (kraythe)
 * @version $Revision: 1.3 $
 */
public class DynamicTypeChecking {
  /**
   * Demonstrates usage of isAssignableFrom on a class object.
   * 
   * @param dataType
   *          The data type to check.
   * 
   * @return The value true if the class is a descendant of
   *         java.lang.Number or false if it isnt.
   */
  public static boolean isNumber(final Class dataType) {
    return Number.class.isAssignableFrom(dataType);
  }
  /**
   * Demonstration Method.
   * 
   * @param args
   *          Command Line arguments.
   */
  public static void main(final String[] args) {
    final Set classes = new HashSet();
    classes.add(Class.class);
    classes.add(Comparable.class);
    classes.add(Serializable.class);
    classes.add(Integer.class);
    classes.add(int.class);
    classes.add(Float[].class);
    classes.add(String.class);
    classes.add(double[].class);
    classes.add(boolean.class);
    System.out.println("Using isAssignableFrom:");
    useAssignable(classes);
    System.out.println("\nUsing isInstance:");
    useIsInstance(classes);
  }
  /**
   * Demonstrates use of isAssignableFrom on objects in a set.
   * 
   * @param inputSet
   *          The set to check.
   */
  public static void useAssignable(final Set inputSet) {
    final Iterator iter = inputSet.iterator();
    Object obj = null;
    while (iter.hasNext()) {
      obj = iter.next();
      if (obj != null) {
        if (Number.class.isAssignableFrom(obj.getClass())) {
          System.out.println(obj);
        }
      }
    }
  }
  /**
   * Demonstrates usage of isInstance on objects in a set.
   * 
   * @param inputSet
   *          The set to check.
   */
  public static void useIsInstance(final Set inputSet) {
    final Iterator iter = inputSet.iterator();
    Object obj = null;
    while (iter.hasNext()) {
      obj = iter.next();
      if (Number.class.isInstance(obj)) {
        System.out.println(obj);
      }
    }
  }
  /**
   * Demonstration method for class comparison based on passed class and object.
   * 
   * @param dataType
   *          The data type to check.
   * @param inputSet
   *          The input set to check.
   * 
   * @throws NullPointerException
   *           If the data type given is null.
   */
  public static void useIsInstance2(final Class dataType, final Set inputSet) {
    if (dataType == null) {
      throw new NullPointerException();
    }
    final Iterator iter = inputSet.iterator();
    Object obj = null;
    while (iter.hasNext()) {
      obj = iter.next();
      if (dataType.isInstance(obj)) {
        System.out.println(obj);
      }
    }
  }
  /**
   * A bad version of useInstance. If you uncomment this method you will get a
   * compiler error.
   */
  // public static void useIsInstance3(final Class dataType, final Set inputSet)
  // {
  // final Iterator iter = inputSet.iterator();
  // Object obj = null;
  // while (iter.hasNext()) {
  // obj = iter.next();
  // if (obj instanceof dataType) {
  // System.out.println(obj);
  // }
}
/* ########## End of File ########## */