簡體   English   中英

Java - 使用Reflection創建新實例,而不需要知道構造函數參數

[英]Java - Create new Instance using Reflection without knowing constructor params

我需要創建許多類的新實例。 我正在使用反射但是當我創建c.newInstance()時,沒有'empty parameter constructor'的類會拋出java.lang.InstantiationException。

現在,我該怎么做才能創建每個類的實例?

我知道我可以使用c.getConstructor(Class).newinstance(params)創建沒有'空參數構造函數'的類的實例,但我不知道每個類的參數。

還有一件事,所有這些類都擴展自另一個名為ParentClass的類,因此我可以使用的一種解決方法是在ParentClass中包含一些強制子類實現“空參數構造函數”的代碼,但不知道如何做這個。

提前致謝 !

您可以調用Class.getConstructors()來獲取給定類的所有構造函數。

在每個構造函數上 ,您可以調用Constructor.getGenericParameterTypes()來了解它所期望的參數。

你不能。 沒有辦法“需要”無參數構造函數並由編譯器強制執行,並且根據定義創建類的實例,您必須為其提供必要的參數,否則您最終會得到一個違反該參數的對象。 class contract(因為它沒有正確初始化)。

在代碼級別強制執行此操作的正確方法是使用對象工廠和接口。 我假設您必須使用反射,因為您在編譯時不了解類型; 在這種情況下,還應該有一個“工廠”知道如何生成每種類型的實例。 應該使用有問題的類型構建/編譯此工廠,以便它知道並可以調用正確的構造函數。 然后,Factory會實現一個代碼可以識別的接口,例如“ObjectFactory”,它允許您委托工廠實例化對象。 然后,您將擁有一些對象工廠可以用來注冊的方法,以便對它可以實例化的任何類型負責。

在您嘗試創建的類附帶的代碼中:

static {
    FactoryRegistry.register(TypeA.class, new TypeAFactory());
}

在你的代碼中:

Class<?> unknownClass = ...;
Object obj = FactoryRegistry.getFactory(unknownClass).newInstance();

(您有一個TypeAFactory實現的Factory接口並指定newInstance方法)

您不知道unknownClass是什么或如何實例化它,但如果該類附帶的代碼注冊了工廠,您可以查詢該工廠並​​要求它為您創建對象。 如果unknownClass確實是TypeA.class ,那么注冊表將返回已注冊以創建對象的TypeAFactory


或者,您可以要求您的框架動態加載的任何代碼的作者都包含無參數構造函數。 它沒有嚴格執行,但作者可以更容易實現。

創建類的實例兩種反射方法java.lang.reflect.Constructor.newInstance()Class.newInstance()

Class.newInstance()只能調用零參數構造函數

無論參數的數量如何,Constructor.newInstance()都可以調用任何構造函數

暫無
暫無

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

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