一、 Source 源代碼階段java
二、 Class 類對象階段dom
三、 runtime 運行時階段ide
一、 Class.forName("全類名");3d
二、 類名.class;code
三、 對象.getClass();對象
多用於對象獲取字節碼blog
同一個字節碼文件(*.class)在一次程序運行過程當中,只會被加載一次。內存
package top.uaoie.day03; import top.uaoie.domain.Person; public class ReflectDome01 { public static void main(String[] args) throws Exception { //1. Class.forName("全類名"); Class clazz1 = Class.forName("top.uaoie.domain.Person"); //2. 類名.class; Class clazz2 = Person.class; //3. 對象.getClass(); Person p = new Person(); Class clazz3 = p.getClass(); System.out.println(clazz1); System.out.println(clazz2); System.out.println(clazz3); //比較三個對象 System.out.println(clazz1 == clazz2); System.out.println(clazz1 == clazz3); } }
一、 獲取全部的成員變量字符串
二、 獲取全部的構造方法get
三、 獲取全部的成員方法
四、 獲取類名
package top.uaoie.domain; public class Person { public String a; protected String b; String c; private String d; @Override public String toString() { return "Person{" + "a='" + a + '\'' + ", b='" + b + '\'' + ", c='" + c + '\'' + ", d='" + d + '\'' + '}'; } }
package top.uaoie.day03; import top.uaoie.domain.Person; import java.lang.reflect.Field; public class ReflectDome02 { public static void main(String[] args) throws Exception { //獲取Person的Class對象,此處是在階段二部分獲取的 //也可在第一階段獲取,如:Class.forName("top.uaoie.domain.Person"); Class p = Person.class; //獲取成員變量 Field[] fields = p.getFields(); for (Field field : fields) { System.out.println(field); } System.out.println("---------------------"); Field a = p.getField("a"); System.out.println(a); //建立一個對象 Person person = new Person(); //獲取成員變量a的值 Object value = a.get(person); System.out.println(value); //設置成員變量a的值 a.set(person, "這是a的值"); System.out.println(person); System.out.println("================="); Field[] declaredFields = p.getDeclaredFields(); for (Field declaredField : declaredFields) { System.out.println(declaredField); } Field d = p.getDeclaredField("d"); //忽略訪問權限修飾符 d.setAccessible(true);//暴力反射 Object value2 = d.get(person); System.out.println(value2); } }