[英]Java: varargs declared constructor
我正在嘗試使用工廠設計模式來實例化對象。 雖然,構造函數具有varargs參數。
public class Foo implements Bar
public Foo(Object... args) {
}
在工廠中,我試圖得到這樣的構造函數:
private Constructor<Bar> getConstructor(Class<Bar> clazz) {
return clazz.getDeclaredConstructor(Object.class);
}
但這是行不通的。 我也嘗試過:
private Constructor<Bar> getConstructor(Class<Bar> clazz) {
return clazz.getDeclaredConstructor(Object[].class);
}
但是我將失去varargs的0參數功能。
有什么辦法嗎?
Varargs參數實際上是一個數組參數,由編譯器和其他一些工具進行特殊處理。 因此,您不能將其用作帶有反射的varargs參數-您必須將其用作數組。
有應對的方法更靈活的方式- MethodHandle
從類java.lang.invoke
包。 使用方法句柄,您不僅可以調用此方法,還可以轉換參數以使用與方法簽名不同的類型。
要使用varargs構造函數,您可以執行以下操作:
MethodHandle constructor = MethodHandles.publicLookup().findConstructor(Foo.class, Object[].class);
constructor.invoke(new Object(), 1, "");
但是我將失去varargs的0參數功能。
你有沒有嘗試過? 您將不會丟失此“ 0參數功能”。 完全沒有元素的數組是合法的。
您知道main()
的原型,對不對? public static void main(String... args)
。 而且,我確定您已經知道這也可以寫成public static void main(String[] args)
。
您可以很好地調用您的main:
java [whatever JVM args here] path.to.my.MainClass
即,沒有爭論。 將分配一個沒有元素的數組。
因此,即使在這種情況下,您的第二個代碼也可以使用。
另外,如果在一個類中聲明至少一個構造函數,則不會生成默認的無參數構造函數。 因此,最后,您是“安全的”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.