2011-07-24 25 views
3

Javaでは、キャスト内でClass.forNameを使用すると、オブジェクトがクラスにキャストされるか、キャストにキャストされます。あなたはこのClass.forNameキャスト

Object a; 
String b = "testing"; 
a = (Class.forName("java.lang.Object")) b; 

をした場合の例としては、クラスのインスタンスまたはオブジェクトのインスタンスでしょうか?

+4

を行う方法です。このような質問は、通常、誰かが解決しようとしているが、間違った経路を辿っているという根本的な問題から生じる。根本的な質問をする(別の)質問を掲示することをお勧めします、人々はおそらくあなたがそこに行く方法を示すことができます。 –

+1

どちらも:そのコードはコンパイルされないため、実行できません。 – meriton

答えて

9

Class.forNameは、Classインスタンスを返します。私は、あなたのコードが引用符で囲まれていないとコンパイルできないと確信しています。あなたはキャストとして関数呼び出しを使用しようとしています。


更新:ちょうど考えを持っていた:あなたはキャストに動的にロードされたクラスを使用する方法を求めているならば、あなたは基本的にできません。キャスティングは(ほとんど)コンパイル時のものです。動的にロードされたクラスに、コードにコンパイルしてキャストできるインターフェイスを実装するか、できない場合は、reflectionを使用して、動的にロードされるクラスのメンバーにアクセスします。

+0

ありがとうございます。私はちょうどそれができるかどうかを知りたかった –

0

Class.forNameは常にクラスを返します。

9

あなたは、クラスオブジェクトの.castメソッドでキャストすることができます:

Object a; 
String b = "testing"; 
a = Class.forName("java.lang.Object").cast(b); 

しかし、あなたはキャストについて間違っアイデア持っているようだ - Javaでの、は、任意のオブジェクトを変更しないキャスト、それだけでコンパイラに指示しますオブジェクトは何らかの型であり、実行時には、VMが実際にそうであるかどうかをテストします(コンパイラがまだそれを証明できない場合)。あなたが "騙された"場合、VMはここでClassCastExceptionを投げます(あなたのオブジェクトは変換されません)。

(プリミティブ型が関与している場合、それは少し異なる動作します。)

Classオブジェクトのcast方法は、この同じメカニズムの一般的な変形です。戻り値の型はTClass<T>)であるため、汎用コードで未知のオブジェクトをあるクラス型にキャストできます。このクラスオブジェクトは型変数に対応します。 これは役に立ちません。戻り値の型はClass.forNameです。Class<?>です。つまり、キャストメソッドはObjectしか返せません。

とにかく、java.lang.Objectへのキャストには何の効果もありません(常に成功します)。 (あなたがメソッドをオーバーロードしている場合、これは問題かもしれません。)

を単に

Object a; 
String b = "testing"; 
a = b; 

を書くことは、ここで同じ効果があります。

+0

回答ありがとう。 –

1

それはインスタンスをキャストする必要がある場合、これは私はあなたが実際に尋ねた質問に答えてきましたが、私の疑いはあなたが基礎となる、さまざまな疑問を持っているということですそれを

String className   = "YourClass"; 
Class someClass   = Class.forName(className); 
Constructor constructor = (Constructor) someClass.getConstructor(); 
Object someInstance  = constructor.newInstance(); 

// now you can cast as allways. 
(YourClass) (someInstance) 
関連する問題