3

プリミティブ型の場合: int、double、short など...

与えられた:

String typeName = "double";

どうすれば入手できdouble.classますか?

通常のクラスでは、次のことができます。

String typeName = "java.lang.Integer"
Class<?> clazz = Class.forName(typeName);  
// Class.forName(typeName) returns Double.class
4

4 に答える 4

3

何か賢いことを試みるのではなく、プリミティブが8つしかないので、switch / caseステートメントを記述したり、マップ(以下のコメントでScorpionが提案)などの他の方法でハードコーディングしたりするのは非常に悪いでしょうか?

Spring Frameworkは、そのバージョンのClass.forNameに対してこのアプローチを採用しています。

于 2012-07-20T17:04:42.913 に答える
3

そんなことはできません。リフレクションのドキュメントを確認してください。「Class.forName()」セクションに移動すると、メモが見つかります。

これはプリミティブ型には使用できません。

1 つのオプションは、プリミティブ型を認識し、一致するクラス (つまり、Integer.class、Double.class など) を返すメソッドを作成することです。

于 2012-07-20T17:09:34.367 に答える
1

@mprivat のリンクをクリックして「.class 構文」のセクションを読むと、最初に次のようになります。

タイプが使用可能であるがインスタンスがない場合、タイプの名前に「.class」を追加することでクラスを取得できます。これは、プリミティブ型のクラスを取得する最も簡単な方法でもあります。

だからdouble.classうまく動作します。

于 2012-07-20T17:59:19.293 に答える
1

名前しか知らないプリミティブ型のクラスを見つけるコードを次に示します。

public class CheckPrimitve {
    public static void main(String[] args) {
        Sample s = new Sample();
        try {
            System.out.println(s.getClass().getField("sampleDouble").getType() == double.class); // returns true
            System.out.println(s.getClass().getField("sampleDouble").getType().isPrimitive()); // returns true
        } catch (NoSuchFieldException e) {          
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        }       
    }
}

class Sample {
    public double sampleDouble;
    public Sample() {
        sampleDouble = 10d;
    }
}
于 2012-10-01T06:09:59.510 に答える