欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java高級特性基礎(chǔ)之反射五連問

 更新時(shí)間:2023年01月11日 10:17:37   作者:世界盡頭與你  
反射賦予了我們在運(yùn)行時(shí)分析類以及執(zhí)行類中方法的能力。通過反射你可以獲取任意一個(gè)類的所有屬性和方法,你還可以調(diào)用這些方法和屬性。本文就來和大家詳細(xì)聊聊Java中的反射,感興趣的可以了解一下

1.反射的作用

它賦予了我們在運(yùn)行時(shí)分析類以及執(zhí)行類中方法的能力。通過反射你可以獲取任意一個(gè)類的所有屬性和方法,你還可以調(diào)用這些方法和屬性

2.反射的優(yōu)缺點(diǎn)

反射讓我們在運(yùn)行時(shí)有了分析操作類的能力,反射可以讓我們的代碼更加靈活、為各種框架提供開箱即用的功能提供了便利。

增加了安全問題,比如可以無視泛型參數(shù)的安全檢查(泛型參數(shù)的安全檢查發(fā)生在編譯時(shí))

另外,反射的性能也要稍差點(diǎn),不過,對于框架來說實(shí)際是影響不大的

3.反射的應(yīng)用場景

Spring/Spring Boot、MyBatis 等等框架中都大量使用了反射機(jī)制

Java動(dòng)態(tài)代理的實(shí)現(xiàn)也依賴反射

Java 中的一大利器 注解 的實(shí)現(xiàn)也用到了反射

4.說一下反射的相關(guān)類有哪些

/**
 * 反射入門
 * 通過字符串形式的類的路徑和方法信息調(diào)用類的方法
 */
public class reflectionTest {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        // 類的路徑
        String classPath = "reflection.Cat";
        // 要執(zhí)行類的方法名稱
        String classMethod = "hi";
        // 加載類
        Class cls = Class.forName(classPath);
        // 通過cls得到你加載的類Cat的對象實(shí)例
        Object o = cls.newInstance();
        // 查看o的運(yùn)行類型,為Cat類型
        System.out.println(o.getClass());  // class reflection.Cat
        // 得到加載的類的方法對象
        // 在反射中,可以把方法視為對象
        Method method = cls.getMethod(classMethod);
        // 通過method實(shí)例調(diào)用方法:即通過方法對象來實(shí)現(xiàn)調(diào)用方法
        method.invoke(o);  // 喵喵喵~

        // 得到name字段的信息
        // 注意:getField不能得到私有的屬性信息
        Field nameField = cls.getField("name");
        System.out.println(nameField.get(o));  // 豹貓(我們定義的屬性名字)

        // 得到構(gòu)造器
        Constructor constructor = cls.getConstructor();
        System.out.println(constructor);  // public reflection.Cat()
    }
}

5.獲取Class對象的六種方式

forName獲取。多用于配置文件讀取類的全路徑,加載類

String classAllPath = "reflection.Cat";
Class ccls = Class.forName(classAllPath);

類名.class。多用于參數(shù)傳遞

System.out.println(String.class);  // class java.lang.String
System.out.println(Cat.class);  // class reflection.Cat

對象.getClass。適用于已經(jīng)存在對象實(shí)例的情況

Cat cat = new Cat();
System.out.println(cat.getClass());  // class reflection.Cat

通過類加載器獲取Class對象,通過類加載器獲取 Class 對象不會(huì)進(jìn)行初始化,意味著不進(jìn)行包括初始化等一系列步驟,靜態(tài)代碼塊和靜態(tài)對象不會(huì)得到執(zhí)行

String classAllPath = "reflection.Cat";
Cat cat = new Cat();
// (1)得到類加載器
ClassLoader classLoader = cat.getClass().getClassLoader();
// (2)通過類加載器得到Class對象
Class<?> cls = classLoader.loadClass(classAllPath);
System.out.println(cls);  // class reflection.Cat

基本數(shù)據(jù)類型通過.class獲取Class對象

Class<Integer> integerClass = int.class;
Class<Character> characterClass = char.class;
Class<Boolean> booleanClass = boolean.class;
System.out.println(integerClass);  // int

基本數(shù)據(jù)類型的包裝類可以通過.TYPE得到Class對象

Class<Integer> type = Integer.TYPE;
System.out.println(type);  // int

到此這篇關(guān)于Java高級特性基礎(chǔ)之反射五連問的文章就介紹到這了,更多相關(guān)Java高級特性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論