0

class.castを試してプロパティを検証する汎用メソッドを作成していますが、ClassCastExceptionが発生し続けます

...テストするクラス

public <T> T get(Properties p, String propKey, Class<T> clazz) throws Exception {

    T val = null;

    Object propValue = p.get(propKey);

    if(propValue== null) {
        throw new Exception("Property (" + propKey + ") is null");
    }

    try {
        val = clazz.cast(propValue); // MARKER

    } catch(Exception e) {
        throw new Exception("Property (" + propKey + ") value is invalid value of type (" + clazz + ")", e);
    }



    return val;
}

...テストクラス

@Before
public void setUp() {
    propUtil = new PropUtil();
    properties = new Properties();
    properties.setProperty("test.int.prop", "3");
}

@Test
public void testGet() {

    try {

        assertEquals(new Integer(3), propUtil.get(properties, "test.int.prop", Integer.class));
    } catch (Exception e) {
        System.out.println(e);
    }
}

MARKERでコメントされたコードがClassCastExceptionを引き起こしています。

どんなアイデアでも大歓迎です。

4

4 に答える 4

3

このPropertiesクラスは、特にを呼び出すときにオブジェクトをHashtable格納します。整数ではなく、「3」を追加しました。効果的に「3」をとしてキャストしようとしているので、正しくスローされます。試すStringsetPropertyString3IntegerClassCastException

assertEquals("3", propUtil.get(properties, "test.int.prop", String.class));

または、を返したい場合は、を使用するか、さらに良い方法として、を使用します。getIntegerHashtable<String, Integer>HashMap<String, Integer>

于 2013-03-26T20:23:25.590 に答える
2

Propertiesここがであると仮定するとjava.util.Properties、値は常にStringsです。

このクラスは、Javaの人々が構成と継承についてあまり注意を払っていなかったときに書き戻されたため、たまたま表示されるメソッドgetProperty()ではなく、メソッドを使用する必要があります。get()HashTable

于 2013-03-26T20:22:20.303 に答える
1

この行

properties.setProperty("test.int.prop", "3");

java.lang.Stringプロパティにを入れます

そして、あなたはあなたに一般的な方法を渡しInteger.classます。だからClassCastException期待されています!

テストしたい場合Integer.classは整数を入力する必要があります

properties.put("test.int.prop", 3);

上記の行では、PropertiesクラスがHashtableを拡張しているため、 putを使用していることに注意してください。

あなたの意図がaを入れてString テストすることであるIntegerなら、あなたはどういうわけかその文字列を整数値に解析しなければなりません

于 2013-03-26T20:23:49.227 に答える
0

返信ありがとうございます。文字列から整数にキャストするという基本的な動作は不可能だったと思います。メソッドを滑らかにして、変換チェックを実行しようとしていました。リフレクションを使用して調べていたソリューションを作成しました。これは次のとおりです。

    Object propValue = p.get(propKey);
    Constructor<T> constructor = clazz.getConstructor(String.class);
    val = constructor.newInstance(propValue);

つまり、String.class(つまり、Stringプロパティ値)を受け取るパブリックコンストラクターを使用します。

御馳走を動作します。

于 2013-03-26T20:33:59.770 に答える