簡體   English   中英

這是“getConstructor()”和“getConstructor((Class <?> [])null)”之間的區別?

[英]which is difference between “getConstructor()” and “getConstructor((Class<?>[]) null)”?

我嘗試通過這個例子來理解這種差異:

import java.lang.reflect.*;
public class ClassDemo {

   public static void main(String[] args) {
     try {
        // returns the Constructor object of the public constructor
        //Class cls[] = new Class[] { String.class };
        Constructor c = String.class.getConstructor();
        System.out.println(c);
     }
     catch(Exception e) {
        System.out.println(e);
     } 
   }
} 

我得到這個結果:

public java.lang.String()

在這個例子中,如果我替換:

Constructor c = String.class.getConstructor();

通過:

Constructor c = String.class.getConstructor((Class<?>[]) null);

我得到了相同的結果......

為什么和微妙的是什么?

提前致謝。

他們完全一樣。

當您調用String.class.getConstructor() ,實際上有一個Class<?>的空數組作為參數。 這等於使用(Class<?>[]) null調用它,可以通過檢查它將類型參數與構造函數中的類型參數進行比較的方式來看出:

private static boolean arrayContentsEq(Object[] a1, Object[] a2) {
    if (a1 == null) {
        return a2 == null || a2.length == 0;
    }

    if (a2 == null) {
        return a1.length == 0;
    }

    if (a1.length != a2.length) {
        return false;
    }

    for (int i = 0; i < a1.length; i++) {
        if (a1[i] != a2[i]) {
            return false;
        }
    }

    return true;
}

如您所見,空數組和空值被視為等號。 您也可以使用new Class<?>[0]作為參數來調用它。

沒有區別,因為它是相同的方法, Class.getConstructor(Class ... parameterTypes) 允許在沒有參數的情況下調用此方法。 這些被稱為varargs

請閱讀手冊。

public java.lang.reflect.Constructor getConstructor(java.lang.Class[] parameterTypes)

它需要構造函數參數的類型。 如果構造函數重載,則需要它。

如果你寫

    System.out.println(String.class.getConstructor(String.class));

輸出public java.lang.String(java.lang.String)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM