天天看點

Java反射之擷取類的資訊(類名,屬性,方法,構造函數)

通過反射擷取類的基本資訊,建立對象并進行相應的設定。

public class Demo02 {
	@SuppressWarnings("all")
	public static void main(String[] args) throws Exception {
		// 另一個com.sg.myReflection.bean包下的User類
		String path = "com.sg.myReflection.bean.User";
		try {
			Class clazz = Class.forName(path);

			// 擷取類名
			String strName01 = clazz.getName();// 擷取完整類名com.sg.myReflection.bean.User
			String strName02 = clazz.getSimpleName();// 直接擷取類名 User

			// 擷取屬性
			Field[] field01 = clazz.getFields(); // 傳回屬性為public的字段
			Field[] field02 = clazz.getDeclaredFields(); // 傳回所有的屬性
			Field field03 = clazz.getDeclaredField("id"); // 擷取屬性為id的字段

			// 擷取普通方法
			Method[] Method01 = clazz.getDeclaredMethods(); // 傳回public方法
			Method method = clazz.getDeclaredMethod("getId", null); // 傳回getId這個方法,如果沒有參數,就預設為null

			
			// 擷取構造方法
			User u1 = (User) clazz.newInstance(); // 擷取無參的構造函數這裡的前提的保證類中應該有無參的構造函數
			// 擷取參數為(int,String,int)的構造函數
			Constructor c2 = clazz.getDeclaredConstructor(int.class, String.class, int.class);
			// 通過有參構造函數建立對象
			User u2 = (User) c2.newInstance(1001, "小小", 18);

			
			// 通過反射調用普通方法
			User u3 = (User) clazz.newInstance();
			Method method03 = clazz.getDeclaredMethod("setId", int.class);
			method.invoke(u3, 1002); // 把對象u3的id設定為1002

			
			
			// 通過反射操作普通的屬性
			User u4 = (User) clazz.newInstance();
			Field f = clazz.getDeclaredField("name");
			f.setAccessible(true); // 設定屬性可以直接的進行通路
			f.set(u4, "石頭");

		} catch (ClassNotFoundException e) {
            e.printStackTrace();
		}
	}
}
           

程式中用到的User類:

public class User {
	// 學号
	public int id;
	// 名字
	String name;
	// 年齡
	int age;

	public User() {
		super();
	}

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

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

}