Reflection Java

/*
Java Reflection in Action
Ira R. Forman and Nate Forman
ISBN 1932394184
Publisher: Manning Publications Co.
*/
import java.awt.Color;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class GetColor {
  static public void main(String[] args) {
    Rabbit rabbit = new Rabbit();
    //start extract snippet3
    setObjectColor(rabbit, Color.WHITE);
    //stop extract snippet3
    if (!rabbit.setColorCalled)
      throw new RuntimeException();
  }
  //start extract setObjectColor
  public static void setObjectColor(Object obj, Color color) {
    Class cls = obj.getClass(); //#1
    try {
      Method method = cls.getMethod("setColor", //#2
          new Class[] { Color.class });
      method.invoke(obj, new Object[] { color }); //#3
    } catch (NoSuchMethodException ex) { //#4
      throw new IllegalArgumentException(cls.getName()
          + " does not support" + "method setColor(:Color)");
    } catch (IllegalAccessException ex) { //#5
      throw new IllegalArgumentException(
          "Insufficient access permissions to call"
              + "setColor(:Color) in class " + cls.getName());
    } catch (InvocationTargetException ex) { //#6
      throw new RuntimeException(ex);
    }
  }
  //stop extract setObjectColor
  static public class Rabbit {
    public boolean setColorCalled = false;
    public void setColor(Color c) {
      setColorCalled = true;
    }
  }
}