2017-04-05 44 views
1

我試圖在運行時將未知類型的對象轉換爲其未知的超類。我認爲最好的方法是使用反射,但它似乎沒有達到預期的效果。下面是代碼示例塊,其中筆記本電腦擴展設備:反射 - 動態地將對象轉換爲Java中的SuperClass

Laptop obj1 = new Laptop(); 
System.out.println(obj1.getClass().getName()); 

String className = obj1.getClass().getSuperclass().getName(); 
System.out.println(className); 
    Object newObj; 
    try { 
     newObj = Class.forName(className).cast(obj1); 
     System.out.println(newObj.getClass().getName()); 

    } catch (ClassNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

所以在這裏我希望看到下面打印到控制檯:

package.Laptop 
package.Device 
package.Device 

但不是我越來越:

package.Laptop 
package.Device 
package.Laptop 

這表明obj1未被轉換爲其父類型設備,因爲我也期望它?

任何人都可以讓我知道我做錯了什麼,或者如果有更好的方法來完成我想要做的事嗎?

+0

這是設計。 – prasanth

+0

對象*總是同時是它們的子類和它們的超類。你不能將一個對象「轉換」爲它的超類。但'getClass()'方法總是返回對象的最深的子類。 –

+0

轉換爲超類的目的是什麼?如果你想隱藏子類的方法/字段,你可以使用裝飾器來隱藏它們。 – glee8e

回答

1

(有代碼中的拼寫錯誤。第三個系統輸出嘗試打印的obj這在你的代碼沒有宣佈,我的回答假設你要打印newObj)

如果你反編譯看看代碼Class類的,鑄造法是這樣的:

public T cast(Object arg0) { 
    if (arg0 != null && !this.isInstance(arg0)) { 
     throw new ClassCastException(this.cannotCastMsg(arg0)); 
    } else { 
     return arg0; 
    } 
} 

那麼有效,你的代碼僅僅是這樣的:

Object newObj = (Device) obj1; 
System.out.println(newObj.getClass().getName()); 

這裏,newObj只是一個新的參照同對象obj1已經在內存中。 所有對newObj上的方法的調用都將是對內存中已存在的obj1方法的調用,並且類型爲Laptop。所以getClass()。getName()將返回「Laptop」。