反射機制
Java反射機制概述
靜態 VS 動態語言
Java Reflection
Java 反射機制研究及應用
Java反射優點和缺點
反射相關的主要API
理解Class類並獲取Class實例
練習代碼1
// 什麼叫反射
public class Test01 {
public static void main(String[] args) throws ClassNotFoundException {
// 通過反射獲取類的Class對象
// 參數傳入包名和類名
Class c1 = Class.forName("com.lwm.reflection.User");
System.out.println(c1);
Class c2 = Class.forName("com.lwm.reflection.User");
Class c3 = Class.forName("com.lwm.reflection.User");
Class c4 = Class.forName("com.lwm.reflection.User");
// 查看創建的對象是否相等用 hashCode(如果hashCode一樣就說明是同一個類)
// 一個類在內存中只有一個class對象
// 一個類被加載後,類的整個結構都會被封裝在class對象中。
System.out.println(c2.hashCode());
System.out.println(c3.hashCode());
System.out.println(c4.hashCode());
}
}
// 實體類:pojo,entity來表示
class User{
private String name;
private int id;
private int age;
public User() {
}
public User(String name,int id,int age) {
this.name = name;
this.id = id;
this.age = age;
}
// 爲什麼要get和set呢?
// 因爲屬性是 private的,私有權限的
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [name=" + name + ", id=" + id + ", age=" + age + "]";
}
}
練習代碼2
// 測試 Class類的創建方式有哪些
public class Test02 {
public static void main(String[] args) throws ClassNotFoundException {
Person person = new Student();
System.out.println("這個人是:" + person.name);
// 方式一:通過對象獲得
Class c1 = person.getClass();
System.out.println(c1.hashCode());
// 都是同一個 Class (Student)
// 方式二:forname 獲得
Class c2 = Class.forName("com.lwm.reflection.Student");
System.out.println(c2.hashCode());
// 方式三:通過類名.class獲得
Class c3 = Student.class;
System.out.println(c3.hashCode());
// 方式四:基本內置類型的包裝類都有一個Type屬性(作爲了解)
// 這裏的對象就和上面的不一樣了,這裏是 Integer,上面是 Student
// public static final Class<Integer> TYPE = (Class<Integer>) Class.getPrimitiveClass("int");
Class c4 = Integer.TYPE;
System.out.println(c4);
// 獲得父類類型
// Student 的一個父類類型(通過獲得這個類,在通過這個類的Class對象去獲得其它屬性(例如:父類))
Class c5 = c1.getSuperclass();
System.out.println(c5);
}
}
class Person{
public String name;
public Person() {
}
public Person(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person [name=" + name + "]";
}
}
class Student extends Person{
public Student() {
this.name = "學生";
}
}
class Teacher extends Person{
public Teacher() {
this.name = "老師";
}
}