2016-05-13 86 views
-4

我打電話與簽名save(Object o)的方法是這樣的:使用類類的一個對象來創建一個新的實例

EntityManager em = new EntityManager(); // My own EntityManager 
User user = new User(); // Constructor provides values 
em.save(user); 

在保存法,我需要實例化一個新的對象,在這種情況下,將類型User這樣的:User user = (User) o;

好了,到目前爲止,我可以提取該對象的類別與o.getClass(),它提供class org.example.User,這是User.class我猜。但我無法弄清楚如何通過它來實現這一行User user = (User) o;

+3

你的問題到底是什麼? – rmlan

+0

您通常會傳入'Class',以便測試演員是否成功;或者,您可以使用'instanceof'。你能提供更多關於你如何加載**的內容嗎?你保存的「Object」(s)? –

+0

你問:「我如何使用反射實例化一個對象」? – Siguza

回答

1

爲了實現線Clazz user = (Clazz) o;,在save方法,其中Clazz是類傳遞到保存方法的對象的,所以在這種情況下User,你可以在save簽名使用泛型如下:

public <T> void save(T user) throws IllegalAccessException, InstantiationException, InvocationTargetException { 
    int i = 0; 
    List<Object> args = new ArrayList<>(); 
    args.add(0,"Example"); 
    T newUser = (T)user.getClass().getConstructors()[i].newInstance(args); 
    // Exciting things... 
} 

注意NEWUSER的類型是從傳遞給方法的對象的類型推斷,那你就需要知道預計要傳遞到該類型的構造函數是什麼對象,創建args陣列,否則會拋出異常。同樣,您需要知道構造函數在數組中的位置以設置i

總之,你需要確保用戶參數將有什麼樣的構造函數,否則你會碰到麻煩。

不過,我相信這個回答你的問題。

+0

我接受了你的答案,因爲你試過了,其他人不理解我的問題(我的錯)。位仍然無法'用newUser訪問類用戶的公共方法,編譯器仍然只顯示了Object類型的方法。不管怎麼說,還是要謝謝你。 – Martin

+0

這是因爲它不知道'T'具有什麼方法,因爲它可能是任何對象。解決方法是用所有用戶類共用的方法創建一個接口,然後確保它們全部實現該接口,並將'public '更改爲'public '。這樣UserInterface的方法將被暴露。 –

+0

我認爲你會傳遞不同類的對象,而不僅僅是所有的'User'類,對嗎?否則,這是所有的頂部,你可以沒有泛型。 –

0

呼喚,你需要在類中的方法newInstance()?它會爲new User()

編輯同樣的效果:我不明白你的問題爲好,但我認爲我是對的

相關問題