1. 程式人生 > >反射簡單入門

反射簡單入門

動態 [] tor leo 做的 私有 set ransient 實例對象

反射的前提是得到這個類的class對象,這個class對象中存在該類的所有屬性,方法等其他信息。反射機制存在於程序運行狀態中,對於任何一個類,只要提供了該類的全限類名,就可以獲取該類的所有信息。底層的工作就交給JVM完成。

下面是自己今天關於反射做的一個小練習入門案例,僅供小白學習 詳細可參考 JDK_API ,如果有需要的同學可以留下郵箱喲

 1 package agree.reflect;
 2 
 3 import java.lang.reflect.Constructor;
 4 import java.lang.reflect.Field;
 5 import java.lang.reflect.Method;
6 7 /** 8 * @since 2018.8.4 9 * @author yangl 10 * 11 * Serializable實現序列化接口,標識該對象可以被序列化,在對象傳遞過程中,使用transient的 字段將不再存在持久化對象中 12 * 13 * 反射被廣泛地用於那些需要在運行時檢測或修改程序行為的程序中。這是一個相對高級 14 * 的特性,只有那些語言基礎非常紮實的開發者才應該使用它。如果能把這句警示時刻放在心 15 * 裏,那麽反射機制就會成為一項強大的技術,可以讓應用程序做一些幾乎不可能做到的事情。
16 * 17 * 缺陷1: 性能第一 Performance Overhead 反射包括了一些動態類型,所以 JVM 18 * 19 * 缺陷2: 安全限制 Security Restrictions 20 * 使用反射技術要求程序必須在一個沒有安全限制的環境中運行。如果一個程序必須在有 安全限制的環境中運行, 如 21 * Applet,那麽這就是個問題了。 22 * 23 * 缺陷3:內部暴露 Exposure of Internals由於反射允許代碼執行一些在正常情況下不被允許的操作(比如訪問私有的屬性和方
24 * 法),所以使用反射可能會導致意料之外的副作用--代碼有功能上的錯誤,降低可移植性。 25 * 反射代碼破壞了抽象性,因此當平臺發生改變的時候,代碼的行為就有可能也隨著變化。 26 * 27 */ 28 public class ReflectDemo { 29 public static void main(String[] args) throws Exception { 30 // 獲取A對象主要是通過該類的class類對象構造方法然後通過newInstance方法實力化 31 // 獲取A的構造方法 32 Constructor<A> a = A.class.getConstructor(String.class, String.class); 33 System.out.println("獲取A的單個構造方法:" + a); 34 // 獲取A的public 聲明的構造方法構造方法 35 Constructor<A>[] as = (Constructor<A>[]) A.class.getConstructors(); 36 print(as, "構造方法 除了private"); 37 // 獲取所有的構造方法 38 Constructor<A>[] all = (Constructor<A>[]) A.class.getDeclaredConstructors(); 39 print(all, "所有構造方法"); 40 41 // 得到客戶的實例對象 42 A av = A.class.newInstance(); 43 A av1 = A.class.cast(av);// 將一個對象強制轉換成此 Class 對象所表示的類或接口 44 System.out.println("獲取實例化對象"+av1.getPwd()); 45 46 // 帶參數實例化對象,由構造器實現 47 A av2 = a.newInstance("yangl", "1"); 48 System.out.println("得到帶參數的實力化對象:"+av2.toString()); 49 50 // 獲取類public所有的屬性 51 Field[] fields = A.class.getFields(); 52 print(fields,"不包括private屬性"); 53 54 //獲取所有的成員屬性 包括私有屬性 55 Field[] allFields=A.class.getDeclaredFields(); 56 print(allFields,"類的所有成員屬性"); 57 58 59 //獲取成員所有方法 60 Method[] ms=A.class.getDeclaredMethods(); 61 print(ms, "成員所有的方法"); 62 63 //執行無參私有方法 64 Method m=A.class.getDeclaredMethod("sayHello"); 65 m.setAccessible(true);//修改執行權限 private 66 m.invoke(av1);//放入該對象 67 68 //執行帶參方法 69 Method m2=A.class.getMethod("sayBye", String.class); 70 m2.invoke(av2, "leon"); 71 72 } 73 74 75 /** 76 * 打印數組 77 * @param objs 78 * @param msg 79 */ 80 public static void print(Object[] objs,String msg){ 81 for(Object obj:objs){ 82 System.out.println(msg+":"+obj.toString()); 83 } 84 } 85 86 87 }
package agree.reflect;

public class A {
    public String name;
    private String pwd;
    public static int count;

    public A() {
        // TODO Auto-generated constructor stub
        this.pwd = "789A";
    }

    private A(String name) {
        this.name = name;
        this.pwd = "456";
    }

    public A(String name, String x) {
        this.name = name;
        this.pwd = x;
    }

    public String getPwd() {
        return pwd;
    }

    private void sayHello() {
        System.out.println("Hello A!");
    }
    
    public void sayBye(String name){
        System.out.println(name+",see you again~");
    }

    @Override
    public String toString() {
        return "A [name=" + name + ", pwd=" + pwd + "]";
    }

}

反射簡單入門