java反射

①. 什么是反射機制?
JAVA反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機制。

靜態(tài)編譯和動態(tài)編譯

靜態(tài)編譯:在編譯時確定類型,綁定對象
動態(tài)編譯:運行時確定類型,綁定對象
②. 反射機制優(yōu)缺點

優(yōu)點: 運行期類型的判斷,動態(tài)加載類,提高代碼靈活度。
缺點: 性能瓶頸:反射相當于一系列解釋操作,通知 JVM 要做的事情,性能比直接的java代碼要慢很多。

④. Java獲取class的三種方法

1.通過new對象實現(xiàn)反射機制 2.通過路徑實現(xiàn)反射機制 3.通過類名實現(xiàn)反射機制

public class Student {
    private int id;
    String name;
    protected boolean sex;
    public float score;
}
public class Get {
    //獲取反射機制三種方式
    public static void main(String[] args) throws ClassNotFoundException {
        //方式一(通過建立對象)
        Student stu = new Student();
        Class classobj1 = stu.getClass();
        System.out.println(classobj1.getName());
        //方式二(所在通過路徑-相對路徑)
        Class classobj2 = Class.forName("fanshe.Student");
        System.out.println(classobj2.getName());
        //方式三(通過類名)
        Class classobj3 = Student.class;
        System.out.println(classobj3.getName());
    }
}

反射獲取構(gòu)造方法并使用

方法名說明
·返回所有公共構(gòu)造方法對象的數(shù)組 Constructor<?>[] getConstructors()
·返回所有構(gòu)造方法對象的數(shù)組Constructor<?>[] getDeclaredConstructors()
·返回單個公共構(gòu)造方法對象Constructor getConstructor(Class<?>... parameterTypes)
·返回單個構(gòu)造方法對象Constructor getDeclaredConstructor(Class<?>...parameterTypes)

public static void main(String[] args) throws ClassNotFoundException,
NoSuchMethodException, IllegalAccessException, InvocationTargetException,
InstantiationException {
    //獲取Class對象
    Class<?> c = Class.forName("com.zq.Student");
    //Constructor<?>[] getConstructors() 返回一個包含 Constructor對象的數(shù)組,
    Constructor對象反映了由該 Class對象表示的類的所有公共構(gòu)造函數(shù)
    // Constructor<?>[] cons = c.getConstructors();
    //Constructor<?>[] getDeclaredConstructors() 返回反映由該 Class對象表示的類
    聲明的所有構(gòu)造函數(shù)的 Constructor對象的數(shù)組
    Constructor<?>[] cons = c.getDeclaredConstructors();
    for(Constructor con : cons) {
      System.out.println(con);
    }
    System.out.println("--------");
    //Constructor<T> getConstructor(Class<?>... parameterTypes) 返回一個
    Constructor對象,該對象反映由該 Class對象表示的類的指定公共構(gòu)造函數(shù)
    //Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 返回
    一個 Constructor對象,該對象反映由此 Class對象表示的類或接口的指定構(gòu)造函數(shù)
    //參數(shù):你要獲取的構(gòu)造方法的參數(shù)的個數(shù)和數(shù)據(jù)類型對應的字節(jié)碼文件對象
    Constructor<?> con = c.getConstructor();
    //Constructor提供了一個類的單個構(gòu)造函數(shù)的信息和訪問權(quán)限
    //T newInstance(Object... initargs) 使用由此 Constructor對象表示的構(gòu)造函數(shù),
    使用指定的初始化參數(shù)來創(chuàng)建和初始化構(gòu)造函數(shù)的聲明類的新實例
    Object obj = con.newInstance();
    System.out.println(obj);
    // Student s = new Student();
    // System.out.println(s);
}

屬性修飾符為private 使用暴力反射 setAccessible(boolean flag):值為true,取消訪問檢查

Constructor類用于創(chuàng)建對象的方法

·根據(jù)指定的構(gòu)造方法創(chuàng)建對象 T newInstance(Object...initargs)

Class類獲取成員變量對象的方法

·Field[] getFields() 返回所有公共成員變量對象的數(shù)組
·Field[] getDeclaredFields() 返回所有成員變量對象的數(shù)組
·Field getField(String name) 返回單個公共成員變量對象
·Field getDeclaredField(String name) 返回單個成員變量對象

public static void main(String[] args) throws ClassNotFoundException,
NoSuchFieldException, NoSuchMethodException, IllegalAccessException,
InvocationTargetException, InstantiationException {
//獲取Class對象
Class<?> c = Class.forName("com.zq.Student");
//Field[] getFields() 返回一個包含 Field對象的數(shù)組, Field對象反映由該 Class對
象表示的類或接口的所有可訪問的公共字段
//Field[] getDeclaredFields() 返回一個 Field對象的數(shù)組,反映了由該 Class對象
表示的類或接口聲明的所有字段
// Field[] fields = c.getFields();
Field[] fields = c.getDeclaredFields();
for(Field field : fields) {
System.out.println(field);
}
System.out.println("--------");
//Field getField(String name) 返回一個 Field對象,該對象反映由該 Class對象表
示的類或接口的指定公共成員字段
//Field getDeclaredField(String name) 返回一個 Field對象,該對象反映由該
Class對象表示的類或接口的指定聲明字段
Field addressField = c.getField("address");
//獲取無參構(gòu)造方法創(chuàng)建對象
Constructor<?> con = c.getConstructor();
Object obj = con.newInstance();
// obj.addressField = "西安";
//Field提供有關(guān)類或接口的單個字段的信息和動態(tài)訪問
//void set(Object obj, Object value) 將指定的對象參數(shù)中由此 Field對象表示的字
段設置為指定的新值
addressField.set(obj,"西安"); //給obj的成員變量addressField賦值為西安
System.out.println(obj);
}

Field類用于給成員變量賦值的方法
void set(Object obj,Object value) 給obj對象的成員變量賦值為value

public static void main(String[] args) throws Exception {
//獲取Class對象
Class<?> c = Class.forName("com.zq.Student");
//Student s = new Student();
Constructor<?> con = c.getConstructor();
Object obj = con.newInstance();
System.out.println(obj);
//s.name = "林青霞";
// Field nameField = c.getField("name"); //NoSuchFieldException:
name
Field nameField = c.getDeclaredField("name");
nameField.setAccessible(true);
nameField.set(obj, "林青霞");
System.out.println(obj);
//s.age = 30;
Field ageField = c.getDeclaredField("age");
ageField.setAccessible(true);
ageField.set(obj,30);
System.out.println(obj);
//s.address = "西安";
Field addressField = c.getDeclaredField("address");
addressField.setAccessible(true);
addressField.set(obj,"西安");
System.out.println(obj);
}

反射獲取成員方法并使用

Method[] getMethods()返回所有公共成員方法對象的數(shù)組,包括繼承的
Method[] getDeclaredMethods()返回所有成員方法對象的數(shù)組,不包括繼承的
Method getMethod(String name, Class<?>...parameterTypes)返回單個公共成員方法對象
Method getDeclaredMethod(String name, Class<?>...
parameterTypes)返回單個成員方法對象

public class ReflectDemo01 {
public static void main(String[] args) throws Exception {
//獲取Class對象
Class<?> c = Class.forName("com.zq.Student");
//Method[] getMethods() 返回一個包含 方法對象的數(shù)組, 方法對象反映由該 Class對
象表示的類或接口的所有公共方法,包括由類或接口聲明的對象以及從超類和超級接口繼承的類
//Method[] getDeclaredMethods() 返回一個包含 方法對象的數(shù)組, 方法對象反映由
Class對象表示的類或接口的所有聲明方法,包括public,protected,default(package)訪問和私
有方法,但不包括繼承方法
// Method[] methods = c.getMethods();
Method[] methods = c.getDeclaredMethods();
for(Method method : methods) {
System.out.println(method);
}
System.out.println("--------");
//Method getMethod(String name, Class<?>... parameterTypes) 返回一個 方法
對象,該對象反映由該 Class對象表示的類或接口的指定公共成員方法
//Method getDeclaredMethod(String name, Class<?>... parameterTypes) 返回
一個 方法對象,它反映此表示的類或接口的指定聲明的方法 Class對象
//public void method1()
Method m = c.getMethod("method1");
//獲取無參構(gòu)造方法創(chuàng)建對象
Constructor<?> con = c.getConstructor();
Object obj = con.newInstance();
// obj.m();
//在類或接口上提供有關(guān)單一方法的信息和訪問權(quán)限
//Object invoke(Object obj, Object... args) 在具有指定參數(shù)的指定對象上調(diào)用此
方法對象表示的基礎方法
//Object:返回值類型
//obj:調(diào)用方法的對象
//args:方法需要的參數(shù)
m.invoke(obj);
// Student s = new Student();
// s.method1();
}
}

Method類用于執(zhí)行方法的方法

Objectinvoke(Object obj,Object... args) 調(diào)用obj對象的成員方法,參數(shù)是args,返回值是Object類型

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容