2012-01-19 22 views
0

リフレクションを使用してクラスのフィールドを1つずつループし、フィールドの名前と値をファイルに保存することで、プロパティファイルを保存しています。Java - キャストオブジェクトをプロパティファイルから読み取る

このクラスをもう一度作成し、プロパティファイルに格納されている値を渡す必要があります。私はこれを思いついた。 returnEntityはクラスの新しいインスタンスです。

for (Field f : returnEntity.getClass().getFields()) 
     { 
      Class fieldType = f.getType(); 
      String fieldName = f.getName(); 

      f.set(returnEntity, fieldType.cast(properties.get(fieldName))); 
     } 

フィールドをタイプ「Int」にキャストするまで機能します。何らかの理由でClassCastExceptionがスローされます。私は間違って何をしていますか?

+0

'int'または' Integer'ですか? –

+0

タイプを見ると「int」と表示されます。 – WildBamaBoy

答えて

1

問題がintは、フロート、のように、クラスではないということですchar、short、long、それらはすべてプリミティブです。この作業を行うには、Integerにキャストし、intValue()を使用する必要があります。

Integer(myInt).intValue(); 
+0

完璧に作業しました!ありがとうございました。 – WildBamaBoy

0

AプロパティにはString型の値のみが含まれます。 Stringをintにキャストする方法はありません。

私はあなたがホイールを再発明していると感じています。 Javaのネイティブ・シリアライゼーションを使用してバイナリ形式でオブジェクトをシリアル化することも、XMLマーシャラを使用してBeanをXMLとして直列化することもできます。

それとも、プロパティへ/から/書き込みを読みたい場合は、なぜ、単純に2つのメソッドを提供し、反射を避けられない。

public toProperties() { 
    Properties p = new Properties(); 
    p.setProperty("foo", foo); 
    p.setProperty("bar", Integer.toString(bar); 
    p.setProperty("zim.blam", zim.getBlam()); 
} 

public static Config fromProperties(Properties p) { 
    Config c = new Config(); 
    c.foo = p.getProperty("foo"); 
    c.bar = Integer.parseInt(p.getProperty("bar")); 
    c.zim = new Zim(); 
    c.zim.setBlam(p.getProperty("zim.blam")); 
} 
+0

私はこのようにして、クラスをプログラムの外で修正できるようにしています。バイナリ形式である必要はありません。 – WildBamaBoy

+0

なぜ反射を使用するのですか?なぜプロパティからオブジェクトをインスタンス化する2つのメソッドを使用し、オブジェクトからプロパティを書き込むのですか? –

+0

あなたは何を意味するのか分かりませんか? – WildBamaBoy

関連する問題