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();
}
}
}