Java之反射

Java仗劍走天涯發表於2017-05-05

反射就是把Java類中的各種成分對映成一個個的java物件。


1.Java反射常用類

Class類—可獲取類和類的成員資訊 
Field類—可訪問類的屬性  
Method類—可呼叫類的方法 
Constructor類—可呼叫類的構造方法

2.如何使用反射

1.匯入java.lang.reflect.* 

2.獲得需要操作的類的Java.lang.Class物件 

3.呼叫Class的方法獲取Field、Method等物件 

4.使用反射API進行操作 (設定屬性﹑呼叫方法)

3.Class類

1)Class類是Java 反射機制的起源和入口

每個類都有自己的Class 物件且每一個類只有一個class 物件
用於獲取與類相關的各種資訊
提供了獲取類資訊的相關方法
Class類繼承自Object類

2)Class類存放類的結構資訊

這裡寫圖片描述

3)【類物件】獲取類的Class 物件

方法1:物件.getClass()
    Person person = new Person();
Class class2 = person.getClass();

方法2:類.class
    Class class1 = Person.class;

方法3:Class.forName()
    Class class3 = Class.forName("com.qf.demo.Person");
    使用forname方法,引數為相對於本工程的Person類檔案路徑

4)【屬性】獲取Field 物件

【只能獲取public的屬性】Field[] fields = class1.getFields();
【獲取所有屬性】Field[] fields2 =  class1.getDeclaredFields();

public屬性

    【得到指定的屬性物件】Field field = class1.getField("age");
    【 給屬性賦值】field.set(object, 5);
    【得到屬性值,返回的是物件】Object object2 = field.get(object);

靜態屬性

    【獲取屬性物件】Field field2 = class1.getDeclaredField("weight");
    【屬性賦值】field2.set(null, 10);
    【獲取屬性值】Object object3 = field2.get(null);

私有屬性

    Field  field3 = class1.getDeclaredField("name");
    【設定許可權】field3.setAccessible(true);
    field3.set(object, "小花");
    Object object4 = field3.get(object);

5)【方法】獲取Method 物件

--Method[] methods = class1.getMethods();// 得到【本類和父類】的【非私有】的方法

--Method[] methods2 = class1.getDeclaredMethods();// 得到【本類】中宣告的所有的方法【包括私有】

--【得到無參無返回值方法】Method method = class1.getMethod("eat", null);
【方法呼叫】method.invoke(object, null);// 引數1:物件;引數2:方法引數

--【得到有參無返回值方法】Method method2 = class1.getMethod("drink", String.class);
【方法呼叫】method2.invoke(object, "水");

--【得到無參有返回值方法】Method method3 = class1.getMethod("sleep", null);
【呼叫】Object  object2 = method3.invoke(object, null);//返回值都是用物件接收

--【靜態方法】Method method4 = class1.getMethod("hehe", null);
【呼叫,不需要傳物件】method4.invoke(null, null); 

--【私有方法】Method method5 = class1.getDeclaredMethod("play", null);
【必須設定訪問許可權】method5.setAccessible(true);// 私有方法預設沒有許可權呼叫,必須單獨設定呼叫許可權
【呼叫】method5.invoke(object, null);

6)【構造方法】獲取Constructor物件

【獲取所有構造方法】Constructor[] constructors = class1.getConstructors();

【得到無參的構造方法】Constructor constructor = class1.getConstructor(null);
【建立物件】Person person = (Person) constructor.newInstance(null);

【得到有參的構造方法】Constructor constructor2 = class1.getConstructor(String.class,int.class,int.class);
【建立物件】Person person2 = (Person) constructor2.newInstance("張三",5,9);

4.反射優缺點

優點

    1 提高了Java程式的靈活性和擴充套件性,降低了耦合性,提高自適應能力
    2 允許程式建立和控制任何類的物件,無需提前硬編碼目標類

缺點

    效能問題
    程式碼維護問題
    可以使用私有的屬性和方法,破壞了程式碼塊的安全性

相關文章