java實現反射

1.什麼是java反射

java反射是一種能夠在項目運行時,知道任意一個類的屬性方法並能夠調用他們。

2.反射的優缺點

優點:反射機制可以實現動態創建對象和編譯

缺點:性能影響,使用反射基本是一種解釋操作,解釋操作慢於直接執行

3.java中獲取class對象的四種方法

Ⅰ、通過class類靜態方法 forname

class c = class.forName("name");

Ⅱ、通過object類的getClass方法

String a = "123";
Class c = a.getClass();

Ⅲ、如果T是 一個已定義類型的話,在java中可以通過 .class獲取

Student s = new Student();
class c = s.class;
class d = int.class;
Ⅳ、運用primitive wrapper classes的TYPE語法

Class c = Integer.TYPE;
Class d = Double.TYPE;

4.demo(如下)

student 類

import java.util.Date;

public class Student {
	private String studentID;
	public String studentName;
	private Date birthday;
	private int score;

	public String getStudentID() {
		return studentID;
	}

	public void setStudentID(String studentID) {
		this.studentID = studentID;
	}

	public String getStudentName() {
		return studentName;
	}

	public void setStudentName(String studentName) {
		this.studentName = studentName;
	}

	public Date getBirthday() {
		return birthday;
	}

	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}

	public int getScore() {
		return score;
	}

	public void setScore(int score) {
		this.score = score;
	}

	public void finishTask(String taskName) {
		System.out.println(studentName + "完成了" + taskName + "作業");
	}
}

ReflectStudentTest1測試類

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

public class ReflectStudentTest1 {
	public static void main(String[] args) {
		try {
			// 獲取Student的Class對象
			//Class<?> clazz = Class.forName("com.hdw.Student");
			//Class<?> clazz = Student.class;
			Class<?> clazz = new Student().getClass();
			// 獲取該類中所有的屬性
			Field[] fields = clazz.getDeclaredFields();
			// 遍歷所有的屬性
			for (Field field : fields) {
				// 打印屬性信息,包括訪問控制修飾符,類型及屬性名
				System.out.println(field);
				System.out.println("修飾符:" + Modifier.toString(field.getModifiers()));
				System.out.println("類型:" + field.getType());
				System.out.println("屬性名:" + field.getName());
			}
			// 獲取該類中的所有方法
			Method[] methods = clazz.getDeclaredMethods();
			for (Method method : methods) {
				// 打印方法簽名
				System.out.println(method);
				System.out.println("修飾符:"
						+ Modifier.toString(method.getModifiers()));
				System.out.println("方法名:" + method.getName());
				System.out.println("返回類型:" + method.getReturnType());
				// 獲取方法的參數對象
				Class<?>[] clazzes = method.getParameterTypes();
				for (Class<?> class1 : clazzes) {
					System.out.println("參數類型:" + class1);
				}
			}

			// 通過Class對象創建實例
			Student student = (Student) clazz.newInstance();
			// 獲取屬性名爲studentName的字段(Field)對象,以便下邊重新設置它的值
			Field studentName = clazz.getField("studentName");
			// 設置studentName的值爲”張三“
			studentName.set(student, "張三");
			// 通過Class對象獲取名爲”finishTask“,參數類型爲String的方法(Method)對象
			Method finishTask = clazz.getMethod("finishTask", String.class);
			// 調用finishTask方法
			finishTask.invoke(student, "數學"); 
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}
}

參見:

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