亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Java筆記-Java反射(二)

luckyw / 1996人閱讀

摘要:構(gòu)造器創(chuàng)建實(shí)例構(gòu)造器和方法的反射類不同點(diǎn)在于,可以創(chuàng)建實(shí)例,代碼如下所示。

上一篇文章介紹了反射的基本概念以及獲取類相關(guān)信息的反射API,這一章節(jié)主要記錄如何對(duì)類的成員進(jìn)行操作的相關(guān)反射API。

操作類成員的類

反射API中提供了如下接口,用于對(duì)類的成員進(jìn)行操作。

 java.lang.reflect.Member

該接口主要有以下三個(gè)實(shí)現(xiàn)類,用于對(duì)類成員中的字段,方法和構(gòu)造器進(jìn)行操作。

Tips: 在Java SE 7的手冊(cè)中指出,構(gòu)造器不是類的成員,這和Member的實(shí)現(xiàn)類想表達(dá)的意思不同。

操作字段

字段擁有類型以及值,使用以下類能夠獲取類中字段的類型信息,獲取字段的值以及對(duì)字段進(jìn)行賦值操作。

 java.lang.reflect.Field
操作方法

方法有返回值,參數(shù),并且可能會(huì)拋出異常,使用以下類可以獲取方法參數(shù)以及返回值的類型信息,也可以調(diào)用指定對(duì)象的方法。

 java.lang.reflect.Method
操作構(gòu)造器

使用如下類可以操作類的構(gòu)造器,提供與操作method類似的方法,但有以下兩點(diǎn)例外,構(gòu)造器沒有有返回值,并且對(duì)構(gòu)造器的調(diào)用可以創(chuàng)建指定類的實(shí)例。

 java.lang.reflect.Constructor
實(shí)際操作 獲取字段類型
public class Main {

    public static String abc = "123";
    private static List a;

    public static void main(String[] args) throws NoSuchFieldException {
        Class c = Main.class;
        Field field = c.getField("abc");
        Field field1 = c.getDeclaredField("a");

        System.out.println(field.getType());
        System.out.println(field.getGenericType());

        System.out.println();

        System.out.println(field1.getType());
        System.out.println(field1.getGenericType());
    }
}

如上代碼所示,獲取對(duì)應(yīng)字段的Field類,具體使用區(qū)別在上一張文末介紹了。
getType直接輸出這個(gè)字段的類類型。
getGenericType直接輸出這個(gè)字段的類型,如果是泛型字段的話,輸出帶有泛型實(shí)際參數(shù)的類型,如果不是泛型則會(huì)在內(nèi)部調(diào)用getType。結(jié)果如下所示。

class java.lang.String
class java.lang.String

interface java.util.List
java.util.List
獲取字段修飾符

類中字段有許多的修飾符,比如 public,private,transient等,java提供了API獲取類的修飾符,不過獲取出來的是一個(gè)int型數(shù)字,好在java提供了Modifier類對(duì)獲得的整型進(jìn)行判斷,如下代碼所示,有興趣的可以對(duì)Modifier源碼進(jìn)行瀏覽。

public class Main {
    public static int a = 1;
    public static void main(String[] args) throws NoSuchFieldException {
        Class c = Main.class;
        Field field = c.getField("a");
        System.out.println(Modifier.isPublic(field.getModifiers()));
        System.out.println(Modifier.isStatic(field.getModifiers()));
    }
}
讀寫字段值

反射可以對(duì)字段進(jìn)行讀寫,如下代碼所示,可以用過setX和getX方法對(duì)字段進(jìn)行讀寫,不過要注意讀寫前后的類型是否匹配,不然會(huì)報(bào)異常。

    private static int a = 1;

    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        Class c = Main.class;
        Field field = c.getDeclaredField("a");
        int b = field.getInt(Main.class);
        System.out.println(b);
        field.setInt(Main.class, 2);
        System.out.println(a);
        field.setFloat(Main.class, (float) 1.1);   // 報(bào)異常
    }
操作方法和構(gòu)造器

之后操作方法的類是Method,操作構(gòu)造器的類是Constructor,通過這些API提供的get方法,可以獲得方法和構(gòu)造器的相關(guān)信息,因此在筆記里也不再贅述。

構(gòu)造器創(chuàng)建實(shí)例

構(gòu)造器和方法的反射類不同點(diǎn)在于,Constructor可以創(chuàng)建實(shí)例,代碼如下所示。

public class Main {

    public Main() {
    }

    public static void main(String[] args) throws IllegalAccessException, InvocationTargetException, InstantiationException {
        Class c = Main.class;
        Constructor[] ctors = c.getConstructors();
        Constructor ctor = null;
        for (int i = 0; i < ctors.length; i++) {
            ctor = ctors[i];
            if (ctor.getGenericParameterTypes().length == 0)     // 需要找到默認(rèn)構(gòu)造函數(shù)創(chuàng)建實(shí)例
                break;
        }

        System.out.println(ctor.newInstance().getClass().getCanonicalName());
    }
}
結(jié)尾

以上就是一些看反射API的一些記錄,這個(gè)工具本身使用上還是很簡(jiǎn)單的,但意義還是比較大的,是很多框架存在的基礎(chǔ),下一篇以struts為例子,寫一個(gè)小demo,展示反射在其中的運(yùn)用。

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

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

相關(guān)文章

  • Java9模塊化學(xué)習(xí)筆記之模塊設(shè)計(jì)模式

    摘要:但是模塊化當(dāng)中,無法掃描只有模塊中可以使用有兩種解決方案定義一個(gè)專門的資源模塊,并使用提供的接口,實(shí)現(xiàn)它,并將這個(gè)實(shí)現(xiàn)注冊(cè)為服務(wù)。有兩種方式使用或包名,包名模塊名使用運(yùn)行時(shí)動(dòng)態(tài)。 模塊設(shè)計(jì)的原則: 1、防止出現(xiàn)編譯時(shí)循環(huán)依賴(主要是編譯器不支持),但運(yùn)行時(shí)是允許循環(huán)依賴的,比如GUI應(yīng)用2、明確模塊的邊界 幾種模塊設(shè)計(jì): API模塊,聚合模塊(比如java.base) 可選依賴 兩種方...

    李文鵬 評(píng)論0 收藏0
  • JAVA筆記 - 收藏集 - 掘金

    摘要:動(dòng)態(tài)代理個(gè)經(jīng)紀(jì)人如何代理個(gè)明星掘金在代理模式女朋友這么漂亮,你缺經(jīng)紀(jì)人嗎中我們用寶強(qiáng)的例子介紹了靜態(tài)代理模式的概念。掘金使用從頭創(chuàng)建一個(gè),這種方法比較簡(jiǎn)單。 動(dòng)態(tài)代理:1 個(gè)經(jīng)紀(jì)人如何代理 N 個(gè)明星 - Android - 掘金在 代理模式:女朋友這么漂亮,你缺經(jīng)紀(jì)人嗎? 中我們用寶強(qiáng)的例子介紹了靜態(tài)代理模式的概念。 本來我的目的是通過大家耳熟能詳?shù)睦觼砑由罾斫?,但是有些網(wǎng)友指責(zé)...

    kamushin233 評(píng)論0 收藏0
  • EMF學(xué)習(xí)筆記)——使用EMF編程——開發(fā)元數(shù)據(jù)

    摘要:使用元數(shù)據(jù)包中包含了中每一個(gè)被建模類對(duì)應(yīng)的接口。任何對(duì)象的元數(shù)據(jù)是使用的實(shí)現(xiàn)來表示的。加載模型的序列化形式是個(gè)在運(yùn)行期間獲取元數(shù)據(jù)的有效方法。反射提供一個(gè)反射式,可以檢查對(duì)象的元數(shù)據(jù)以及一般地訪問和操縱數(shù)據(jù)。 使用元數(shù)據(jù)   Java包org.eclipse.emf.ecore中包含了Ecore中每一個(gè)被建模類對(duì)應(yīng)的接口。任何EMF對(duì)象的元數(shù)據(jù)是使用Ecore的實(shí)現(xiàn)(implement...

    Jiavan 評(píng)論0 收藏0
  • 四年來Android面試大綱,作為一個(gè)Android程序員

    摘要:再附一部分架構(gòu)面試視頻講解本文已被開源項(xiàng)目學(xué)習(xí)筆記總結(jié)移動(dòng)架構(gòu)視頻大廠面試真題項(xiàng)目實(shí)戰(zhàn)源碼收錄 Java反射(一)Java反射(二)Java反射(三)Java注解Java IO(一)Java IO(二)RandomAccessFileJava NIOJava異常詳解Java抽象類和接口的區(qū)別Java深拷貝和淺拷...

    不知名網(wǎng)友 評(píng)論0 收藏0
  • Java筆記-反射機(jī)制(一)

    摘要:反射機(jī)制一結(jié)合官方通過編寫的反射教程,復(fù)習(xí)一下反射的知識(shí)。反射的概念反射是一種在運(yùn)行時(shí)獲取以及修改應(yīng)用行為的一種工具。因?yàn)榉瓷湫枰獎(jiǎng)討B(tài)的解析類的信息,相比于非反射使用的方式要慢。反射需要獲取一定的運(yùn)行時(shí)權(quán)限,在特定的安全環(huán)境下不一定存在。 Java反射機(jī)制(一) 結(jié)合Oracle官方通過JDK8編寫的反射教程,復(fù)習(xí)一下反射的知識(shí)。結(jié)尾篇補(bǔ)一個(gè)小例子。 主要內(nèi)容 這次博客的主要內(nèi)容就是簡(jiǎn)...

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

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

0條評(píng)論

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