成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

【Java反射】Java 泛型基礎(chǔ)

seanHai / 3137人閱讀

摘要:筆記來(lái)源反射綜述類(lèi)的使用方法的反射成員變量的反射構(gòu)造函數(shù)的反射類(lèi)加載機(jī)制類(lèi)的使用在面向?qū)ο蟮氖澜缋?,萬(wàn)事萬(wàn)物皆對(duì)象。

筆記來(lái)源:IMOOC 反射
Java Reflect

綜述

Class類(lèi)的使用

方法的反射

成員變量的反射

構(gòu)造函數(shù)的反射

類(lèi)加載機(jī)制

Class 類(lèi)的使用

在面向?qū)ο蟮氖澜缋?,萬(wàn)事萬(wàn)物皆對(duì)象。

但在Java里面有兩樣?xùn)|西不是對(duì)象:靜態(tài)的成員、普通數(shù)據(jù)類(lèi)型類(lèi)(但它們有封裝類(lèi)彌補(bǔ))

類(lèi)是對(duì)象,類(lèi)是 java.lang.Class 的實(shí)例對(duì)象(There is a class named Class)

package com.gcusky.reflect;

class ClassDemo {
    Foo foo = new Foo(); // Foo的實(shí)例對(duì)象
    /**
     * foo 是 Foo 類(lèi)的實(shí)例對(duì)象
     * Foo 是 Class 類(lèi)的實(shí)例對(duì)象,又叫類(lèi)類(lèi)型(class type)
     */
    // 表示1 -> 任何一個(gè)類(lèi)都有一個(gè)隱含的靜態(tài)成員變量class
    Class c1 = Foo.class;
    // 表示2 -> 已知該類(lèi)對(duì)象可用getClass方法獲取類(lèi)類(lèi)型
    Class c2 = foo.getClass();
    // 表示3 -> 用類(lèi)的全稱(chēng)獲取
    try {
        Class c3 = Class.forName("com.gcusky.reflect.Foo");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    // 可以通過(guò)類(lèi)的類(lèi)類(lèi)型創(chuàng)建該類(lèi)的實(shí)例對(duì)象
    try {
        Foo foo1 = (Foo)c1.newInstance();
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}
class Foo
Java 動(dòng)態(tài)加載類(lèi)

Class.forName("類(lèi)的全稱(chēng)")

不僅表示了類(lèi)的類(lèi)類(lèi)型,還代表了動(dòng)態(tài)加載類(lèi)

編譯時(shí)刻加載類(lèi)是靜態(tài)加載類(lèi)

運(yùn)行時(shí)刻加載類(lèi)是動(dòng)態(tài)加載類(lèi)

class Office {
    public static void main(String[] args) {
        // new 創(chuàng)建對(duì)象,是靜態(tài)加載類(lèi),在編譯時(shí)就需要加載所有可能使用到的類(lèi)
        if("Word".equals(args[0])) {
            Word w = new Word();
            w.start();
        }
        // Class.forName 創(chuàng)建對(duì)象,是動(dòng)態(tài)加載類(lèi),在運(yùn)行時(shí)才加載
        try {
            Class c = Class.forName(args[0])
            Word w = (Word) c.newInstance(); // 通過(guò)類(lèi)類(lèi)型,創(chuàng)建該對(duì)象
            w.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Java 獲取方法信息

基本的數(shù)據(jù)類(lèi)型,void 關(guān)鍵字都存在類(lèi)類(lèi)型

java.lang.reflect.Method 封裝了關(guān)于方法的操作

package com.gcusky.reflect;
import java.lang.reflect.Method;

public class Demo {
    /**
     * 打印類(lèi)的信息,包括類(lèi)的成員函數(shù)、成員變量
     * @param obj 對(duì)象
     */
    public static void printClassMessage(Object obj) {
        // 要獲取類(lèi)的信息,首先要獲取類(lèi)的類(lèi)類(lèi)型
        Class c = obj.getClass();
        // 獲取類(lèi)的全名
        String fullName = c.getName();
        /**
         * Method類(lèi):方法對(duì)象
         * 一個(gè)成員方法就是一個(gè)Method對(duì)象
         * getMethods()方法獲取的是所有的public的函數(shù),包括父類(lèi)繼承而來(lái)的
         * getDeclaredMethods() 獲取的是所有該類(lèi)自己聲明的方法,不問(wèn)訪問(wèn)權(quán)限
         */
        Method[] ms = c.getMethods(); // c.getDeclaredMethods();
        for (int i = 0; i < ms.length; i++) {
            // 得到方法的返回類(lèi)型
            Class returnType = ms[i].getReturnType();
            // 得到方法的名稱(chēng)
            String name = ms[i].getName();
            // 獲取參數(shù)類(lèi)型
            Class[] paramTypes = ms[i].getParameterTypes();
        }
    }
}
Java 獲取成員變量信息

成員變量也是對(duì)象

java.lang.reflect.Field 封裝了關(guān)于成員變量的操作

        /**
         * 成員變量也是對(duì)象,F(xiàn)ield封裝了關(guān)于成員變量的操作
         * getFields()獲取的是所有的public的成員變量
         * getDeclaredMethods()獲取的是所有該類(lèi)自己聲明的成員變量
         */
        Field[] fs = c.getDeclaredFields(); // c.getFields();
        for (int i = 0; i < fs.length; i++) {
            // 得到成員變量的類(lèi)型
            Class fieldType = fs[i].getType();
            String typeName = fieldType.getName();
            // 得到成員變量的名稱(chēng)
            String fieldName = fs[i].getName();
        }
Java 獲取構(gòu)造函數(shù)信息
        /**
         * 構(gòu)造函數(shù)也是對(duì)象
         * java.lang.Constructor中封裝了構(gòu)造函數(shù)的信息
         */
        Constructor[] cs = c.getDeclaredConstructors();
        for (Constructor constructor : cs) {
            constructor.getName();
            Class[] paramType = constructor.getParameterTypes();
        }
Java 方法的反射

如何獲取某個(gè)方法:方法的名稱(chēng)和方法的參數(shù)列表才能唯一決定某個(gè)方法

方法反射的操作:method.invoke(對(duì)象, 參數(shù)列表)

class A {
    public void print(int a, int b) {
        System.out.println(a + b);
    }
}
A a = new A();
Class c = a.getClass();
try {
    // Method m = c.getMethod("print", new Class[]{int.class, int.class});
    Method m = c.getMethod("print", int.class, int.class);
    // Object o = m.invoke(a, new Object[]{10, 20});
    Object o = m.invoke(a, 10, 20);
} catch (Exception e) {
    e.printStackTrace();
}
Java 類(lèi)加載機(jī)制
ArrayList list = new ArrayList();
ArrayList list1 = new ArrayList();
list == list1; // true
list1.add(20); // error - 編譯檢測(cè)出錯(cuò)

反射都是編譯之后的操作,因此可看出泛型在編譯之后會(huì)被擦除

Java 中集合的泛型用于防止錯(cuò)誤輸入,只在編譯階段有效,繞過(guò)編譯則無(wú)效

Class c = list1.getclass();
try {
    Method m = c.getMethod("add", Object.class);
    m.invoke(list1, 20); // correct - 繞過(guò)編譯操作就繞過(guò)了泛型
} catch (Exception e) {
    e.printStackTrace();
}

參考資料:

先有Class還是先有Object?

Scala Reflection - Mirrors,ClassTag,TypeTag and WeakTypeTag

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/69142.html

相關(guān)文章

  • java基礎(chǔ)鞏固-泛型基礎(chǔ)知識(shí)整理

    摘要:當(dāng)某個(gè)類(lèi)型變量只在整個(gè)參數(shù)列表的所有參數(shù)和返回值中的一處被應(yīng)用了,那么根據(jù)調(diào)用方法時(shí)該處的實(shí)際應(yīng)用類(lèi)型來(lái)確定。即直接根據(jù)調(diào)用方法時(shí)傳遞的參數(shù)類(lèi)型或返回值來(lái)決定泛型參數(shù)的類(lèi)型。 標(biāo)簽: java [TOC] 本文對(duì)泛型的基本知識(shí)進(jìn)行較為全面的總結(jié),并附上簡(jiǎn)短的代碼實(shí)例,加深記憶。 泛型 將集合中的元素限定為一個(gè)特定的類(lèi)型。 術(shù)語(yǔ) ArrayList -- 泛型類(lèi)型 ArrayLis...

    KoreyLee 評(píng)論0 收藏0
  • Java知識(shí)點(diǎn)總結(jié)(反射-反射操作泛型

    摘要:知識(shí)點(diǎn)總結(jié)反射反射操作泛型知識(shí)點(diǎn)總結(jié)反射采用泛型擦除的機(jī)制來(lái)引入泛型。中的泛型僅僅是給編譯器使用的,確保數(shù)據(jù)的安全性和免去強(qiáng)制類(lèi)型轉(zhuǎn)換的麻煩。 Java知識(shí)點(diǎn)總結(jié)(反射-反射操作泛型) @(Java知識(shí)點(diǎn)總結(jié))[Java, 反射] Java采用泛型擦除的機(jī)制來(lái)引入泛型。Java中的泛型僅僅是給編譯器javac使用的, 確保數(shù)據(jù)的安全性和免去強(qiáng)制類(lèi)型轉(zhuǎn)換的麻煩 。但是,__一旦編譯完成,...

    AprilJ 評(píng)論0 收藏0
  • Java筆記-Java反射(二)

    摘要:構(gòu)造器創(chuàng)建實(shí)例構(gòu)造器和方法的反射類(lèi)不同點(diǎn)在于,可以創(chuàng)建實(shí)例,代碼如下所示。 上一篇文章介紹了反射的基本概念以及獲取類(lèi)相關(guān)信息的反射API,這一章節(jié)主要記錄如何對(duì)類(lèi)的成員進(jìn)行操作的相關(guān)反射API。 操作類(lèi)成員的類(lèi) 反射API中提供了如下接口,用于對(duì)類(lèi)的成員進(jìn)行操作。 java.lang.reflect.Member 該接口主要有以下三個(gè)實(shí)現(xiàn)類(lèi),用于對(duì)類(lèi)成員中的字段,方法和構(gòu)造器進(jìn)行操作...

    luckyw 評(píng)論0 收藏0
  • Java學(xué)習(xí)路線總結(jié),搬磚工逆襲Java架構(gòu)師(全網(wǎng)最強(qiáng))

    摘要:哪吒社區(qū)技能樹(shù)打卡打卡貼函數(shù)式接口簡(jiǎn)介領(lǐng)域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號(hào)作者架構(gòu)師奮斗者掃描主頁(yè)左側(cè)二維碼,加入群聊,一起學(xué)習(xí)一起進(jìn)步歡迎點(diǎn)贊收藏留言前情提要無(wú)意間聽(tīng)到領(lǐng)導(dǎo)們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨(dú)立帶隊(duì)的人太少,簡(jiǎn)而言之,不缺干 ? 哪吒社區(qū)Java技能樹(shù)打卡?【打卡貼 day2...

    Scorpion 評(píng)論0 收藏0
  • Reflection:Java反射機(jī)制基礎(chǔ)

    摘要:反射機(jī)制是什么反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類(lèi),都能夠知道這個(gè)類(lèi)的所有屬性和方法對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法和屬性這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱(chēng)為語(yǔ)言的反射機(jī)制反射機(jī)制能做什么反射機(jī)制主要提供了以下功 反射機(jī)制是什么 反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類(lèi),都能夠知道這個(gè)類(lèi)的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法和屬性;這種...

    hizengzeng 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<