Reflection in Java

Person.java

import java.util.Calendar;

public class Person
{
	public String publicString1;
	public String publicString2;
	
	private String fname;
	private String lname;
	protected int birthYear;
	String address;
	String city;
	String state;
	String zipCode;
	
	public Person(String fname, String lname) {
		super();
		this.fname = fname;
		this.lname = lname;
	}
	
	public Person(String fname, String lname, int birthYear) {
		super();
		this.fname = fname;
		this.lname = lname;
		this.birthYear = birthYear;
	}

	public String getFname() {
		return fname;
	}
	public void setFname(String fname) {
		this.fname = fname;
	}
	public String getLname() {
		return lname;
	}
	public void setLname(String lname) {
		this.lname = lname;
	}
	public int getBirthYear() {
		return birthYear;
	}
	public void setBirthYear(int birthYear) {
		this.birthYear = birthYear;
	}
	public int calculateAge()
	{
		Calendar calendar = Calendar.getInstance();
		return calendar.get(Calendar.YEAR) - birthYear;
	}
	public void setAddress(String address, String city, String state, String zipCode)
	{
		this.address = address;
		this.city = city;
		this.state = state;
		this.zipCode = zipCode;
	}
	public String toString()
	{
		return fname + " " + lname;
	}
}

Shape.java

public class Shape <T, K> {
	T left;
	T right;
	K top;
	K bottom;

	public Shape(T left, T right, K top, K bottom) {
		this.left = left;
		this.right = right;
		this.top = top;
		this.bottom = bottom;
	}
}

Square.java

public class Square extends Shape {
	public Square(T left, T right, K bottom, K top) {
		super(left, right, top, bottom);
	}
}

Rectangle.java

public class Rectangle extends Shape<Integer, Integer>{
	public Rectangle(Integer left, Integer right, Integer bottom, Integer top) {
		super(left, right, top, bottom);
	}
}

Reflection.java

package com.tutorial;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;

public class Reflection {
	static void AnalyzePerson()
	{
		try {
			Class<?> c = Class.forName("com.tutorial.Person");
			
			//print out all functions in class Person
			Method [] m = c.getDeclaredMethods();
			for(int i = 0; i < m.length; i++)
			{
				System.out.println("Method Name: " + m[i].getName());
				System.out.println("Return Type: " + m[i].getReturnType());
				Class<?>[] t = m[i].getParameterTypes();
				for(int j = 0; j < t.length; j++)
					System.out.println("Parameters: " + t[j].getName());
				
				System.out.println();
			}
			
			//print out all public field in class Person
			Field [] f = c.getDeclaredFields();
			for(int i = 0; i < f.length; i++)
				System.out.println("Fields: " + Modifier.toString(f[i].getModifiers()) + " " + f[i].getName());
			
			System.out.println();
			
			//calls constructor
			Class <?> parameterType[] = {String.class, String.class};
			Constructor<?> ct = c.getConstructor(parameterType);
			Object argList[] = {"John", "Smith"};
			Object newPerson = ct.newInstance(argList);
			System.out.println(((Person)newPerson).toString());
			
			//sets birthday
			Class <?> parameterType1[] = {Integer.TYPE};
			Method m1 = c.getMethod("setBirthYear", parameterType1);
			Object argList1[] = {new Integer(1985)};
			m1.invoke(newPerson, argList1);
			
			//calculate age
			Method m2 = c.getMethod("calculateAge");
			Object ret = m2.invoke(newPerson);
			System.out.println("Age: " + ret);
			System.out.println();
			
			//set field publicString1
			Field field = c.getField("publicString1");
			field.set(newPerson, "Alfred");
			Object obj = field.get(newPerson);
			System.out.println(obj);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	static void AnalyzeSquare()
	{
		System.out.println("----------------------------------------");
		try {
			Class <?> c = Class.forName("com.tutorial.Square");
			//get base class
			Class <?>superc = c.getSuperclass();
			System.out.println("Base Class: " + superc.getName());
			
			//get parameters for square
			Square<Integer, Integer> s = new Square<Integer, Integer>(1, 1, 100, 100);
			ParameterizedType pt = (ParameterizedType)s.getClass().getGenericSuperclass();
			System.out.println(pt);
			
			//get parameters for rectangle
			Rectangle r = new Rectangle(2, 2, 100, 300);
			pt = (ParameterizedType)r.getClass().getGenericSuperclass();
			System.out.println(pt);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
	}
	public static void main(String[] args) {
		AnalyzePerson();
		AnalyzeSquare();
	}
}