Java 反射概念 - 基礎學習(reflect)

/**   
*create date: 2016年2月19日下午3:18:33
*update date: 2016年2月19日下午3:18:33 
*/

import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @author liuwb
 */
public class ReflectTrip {

	public static void main(String[] args) {
		// 1.學習如何獲取 Class對象
		ReflectTrip.getClassForReflect();

		// 2.學習reflect類庫(Field,Method,Constructor,Array)
		ReflectTrip.learnReflectClass();
	}

	/**
	 * 1.獲取Class對象的三種方式
	 * 
	 * @author liuwb
	 * @since JDK 1.8
	 */
	public static void getClassForReflect() {
		Class<?> cls = null;
		try {
			// 1.經過Class類獲取class對象;
			cls = Apple.class;

			// 2.經過Class實例獲取class對象;
			cls = new Apple(null, null).getClass();

			// 3.經過Class類名稱獲取class對象;
			cls = Class.forName("cn.com.aben.reflect.main.Apple");

		} catch (ClassNotFoundException e1) {
			e1.printStackTrace();
		}
		System.out.print(String.valueOf(1) + ".class對象爲:\t");
		System.out.println(cls != null ? cls.getName() : "null");
	}

	public static void learnReflectClass() {
		Apple ap = null;
		// 一.經過反射實例化對象的兩種方式
		try {
			// ap = Apple.class.newInstance(); //一般用於無參實例化
			ap = Apple.class.getConstructor(new Class<?>[] { String.class, String.class })
					.newInstance(new Object[] { "", "" });
		} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
				| NoSuchMethodException | SecurityException e) {
			e.printStackTrace();
		}

		Method[] methods = null;
		Method method = null;
		// 二.經過反射獲取並調用class對象的方法
		try {
			// 1.獲取class對象的所有方法(含超類,不含私有)
			methods = Apple.class.getMethods();
			for(Method data : methods) {
				System.out.println("二.1.\t" + data.getName() + "\t" + data.getModifiers() + "\t" + data.getReturnType());
			}

			// 2.獲取class對象的聲明方法(含私有,不含超類)
			methods = Apple.class.getDeclaredMethods();
			for(Method data : methods) {
				System.out.println("二.2.\t" + data.getName() + "\t" + data.getModifiers() + "\t" + data.getReturnType());
			}
			
			// 3.獲取class對象指定名稱的方法(含超類,不含私有)
			method = Apple.class.getMethod("setName", String.class);

			// 4.獲取class對象指定名稱的方法(含私有,不含超類)
			method = Apple.class.getDeclaredMethod("setName", String.class);

			// 5.經過反射調用方法
			method.invoke(ap, "I'm reflect invoke method excuting.");

			method = Apple.class.getDeclaredMethod("getName");
			System.out.println(String.valueOf(2) + "." + method.invoke(ap));
		} catch (Exception e) {
			e.printStackTrace();
		}

		Field[] fields = null;
		Field field = null;
		// 三.經過反射獲取並調用class對象的屬性
		try {
			// 1.獲取class對象的所有屬性(含超類,不含私有)
			fields = Apple.class.getFields();
			for(Field data : fields) {
				System.out.println("三.1.\t" + data.getName() + "\t" + data.getModifiers());
			}

			// 2.獲取class對象的聲明屬性(含私有,不含超類)
			fields = Apple.class.getDeclaredFields();
			for(Field data : fields) {
				System.out.println("三.2.\t" + data.getName() + "\t" + data.getModifiers());
			}

			// 3.獲取class對象指定名稱的屬性(含超類,不含私有)
			field = Apple.class.getField("name");

			// 4.獲取class對象指定名稱的聲明屬性(含私有,不含超類)
			field = Apple.class.getDeclaredField("name");
			
			// 5.經過反射設置屬性值(私有屬性不能設置)
			//	field.setAccessible(true); //經過setAccessible方法使私有屬性可操做(缺點:破壞對象的封裝性)
			field.set(ap, "I'm field reflect.");
			
			// 6.經過反射獲取屬性值
			Object name = field.get(ap);
			
			System.out.println(String.valueOf(3) + "." + name);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		// 四.經過反射操做數組(Array)
		try {
			int length = 10;
			
			// 1.建立對應class對象的數組
			Object array = Array.newInstance(Class.forName("java.lang.String"), length);
			
			// 2.對數組進行賦值
			Array.set(array, length - 1, "nine");
			
			// 3.獲取數組的指定下標元素
			String result = (String)Array.get(array, length - 1);
			
			System.out.println(result);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

class Apple {
	public String name;

	private String beathday;

	/**
	 * Creates a new instance of Apple.
	 *
	 * @param name
	 * @param beathday
	 */
	public Apple(String name, String beathday) {
		super();
		this.name = name;
		this.beathday = beathday;
	}

	/**
	 * @return the name
	 */
	public String getName() {
		return name;
	}

	/**
	 * @param name
	 *            the name to set
	 */
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * @return the beathday
	 */
	public String getBeathday() {
		return beathday;
	}

	/**
	 * @param beathday
	 *            the beathday to set
	 */
	public void setBeathday(String beathday) {
		this.beathday = beathday;
	}
}
相關文章
相關標籤/搜索