反射的基本使用實例

package com.franky.reflex;

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

/**
 * @描述 反射的基本使用實例	
 * @作者 franky
 * @日期 2014-12-30 下午4:08:34
 */
public class ReflexTest {

	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		String className = "com.franky.reflex.Person";
		//得到Person類的Class對象,在編譯時期,編譯器並不知道得到的是哪個類的Class對象,因此需要轉換
		Class<Person> clazz = (Class<Person>) Class.forName(className);
		
		//得到無參的構造方法
		Constructor<Person> consByNullPrams = clazz.getConstructor();
		//得到有參的構造方法,參數也是Class對象
		Constructor<Person> consByPrams = clazz.getConstructor(int.class,String.class);
		
		//實例化無參的構造方法的對象,可以由構造器實例化,也可以直接用Class對象實例化
		consByNullPrams.newInstance();
		Person person = clazz.newInstance();
		
		//實例化有參的構造方法對象
		Person person2 = consByPrams.newInstance(22,"tom");
		
		//得到成員字段,私有字段需要設置訪問權限爲true進行訪問
		Field field = clazz.getDeclaredField("age");
		//得到所有聲明的字段數組
		Field[] fields = clazz.getFields();
		
		//設置訪問權限
		field.setAccessible(true);
		//得到字段所在對象的值
		int age = (int) field.get(person2);
		System.out.println(age);
		
		//遍歷公開的字段並替換其中的字符
		for (Field f : fields) {
			if(f.getType() == String.class){
				String str = (String) f.get(person2);
				str = str.replace('a', 'x');
				f.set(person2, str);
			}
		}
		
		System.out.println(person2);
		
		
		//得到成員方法並調用
		Method method = clazz.getMethod("setAge", int.class);
		//如果method.invoke(null,args)第一個參數爲Null時候,代表調用的是靜態方法
		method.invoke(person2, 55);
		//JDK1.4的調用方式,參數可以是Object數組
		method.invoke(person2, new Object[]{66});
		System.out.println(person2.getAge());
	}

}

Person類

package com.franky.reflex;

/**
 * @描述 測試反射的Person類
 * @作者 franky
 * @日期 2014-12-30 下午5:53:14
 */
public class Person {

	private int age;
	private String name;
	
	public String str1 = "aaaaaaaaaaaaa";
	public String str2 = "bbbbbbaaaaaaa";
	public String str3 = "ccccccaaaaaaa";
	
	/**
	 * @return the age
	 */
	public int getAge() {
		return age;
	}

	/**
	 * @param age the age to set
	 */
	public void setAge(int age) {
		this.age = age;
	}

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

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

	public Person(int age, String name) {
		super();
		this.age = age;
		this.name = name;
	}

	public Person() {
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Person [str1=" + str1 + ", str2=" + str2 + ", str3=" + str3
				+ "]";
	}


	
	

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章