Reflection Java

/*
 This program is a part of the companion code for Core Java 8th ed.
 (http://horstmann.com/corejava)
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 You should have received a copy of the GNU General Public License
 along with this program.  If not, see .
 */
import java.lang.reflect.Method;
/**
 * This program shows how to invoke methods through reflection.
 * 
 * @version 1.1 2004-02-21
 * @author Cay Horstmann
 */
public class MethodPointerTest {
  public static void main(String[] args) throws Exception {
    // get method pointers to the square and sqrt methods
    Method square = MethodPointerTest.class.getMethod("square", double.class);
    Method sqrt = Math.class.getMethod("sqrt", double.class);
    // print tables of x- and y-values
    printTable(1, 10, 10, square);
    printTable(1, 10, 10, sqrt);
  }
  /**
   * Returns the square of a number
   * 
   * @param x
   *          a number
   * @return x squared
   */
  public static double square(double x) {
    return x * x;
  }
  /**
   * Prints a table with x- and y-values for a method
   * 
   * @param from
   *          the lower bound for the x-values
   * @param to
   *          the upper bound for the x-values
   * @param n
   *          the number of rows in the table
   * @param f
   *          a method with a double parameter and double return value
   */
  public static void printTable(double from, double to, int n, Method f) {
    // print out the method as table header
    System.out.println(f);
    double dx = (to - from) / (n - 1);
    for (double x = from; x <= to; x += dx) {
      try {
        double y = (Double) f.invoke(null, x);
        System.out.printf("%10.4f | %10.4f%n", x, y);
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }
}