2017-04-05 6 views
1

実行時に不明な型のオブジェクトを未知のスーパークラスに変換しようとしています。私はこれを行うための最善の方法は、反射を使用することであると考えましたが、それは望みの効果を持つようには見えません。ここではノートPCがデバイスを拡張するコードの例ブロックは次のとおりです。リフレクション - Javaでオブジェクトをスーパークラスに動的に変換する

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

(あなたのコードにタイプミスがある。第三SYSOUTは、あなたのコード内で宣言されていない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のメソッドへのすべての呼び出しは、すでにメモリに存在し、Laptopタイプのobj1のメソッドへの呼び出しになります。したがって、getClass()。getName()は "Laptop"を返します。

関連する問題