1

文字列引数を取り、その型のクラスを返すメソッドを作成したいと考えています。

たとえば、私が合格した場合Long、それは返されるはずですLong.class

疑似コード:

private Class<?> classReturn(String className){
return new Class<className>;
}

編集::問題は、次のような値"String"しか持っていないことです。いいえ"java.lang.String"

Edit2: String に変数があります。上記のクラスにキャストしたい。たとえば、文字列値="1"; 文字列型 = "ロング"; 私はこのようなものが欲しい(疑似コード):

value = (classReturn(type)) value ;
4

3 に答える 3

1
return Class.forName(className);

編集に関しては、文字列値を長い値に「キャスト」することはできません。文字列値を他の型に変換するには、thisのようにもっと複雑なものが必要です。

于 2012-09-11T14:10:19.790 に答える
1

使用できます

Class.forName(className);

短いクラス名を使用している場合は、次のようなパスを実装する必要があります

文字列を変換するためにできる最も近い方法は、valueOf や文字列を受け取るコンストラクターなどの規則を想定することです。

public static <T> T parseAs(String text, String className) {
    Class clazz;
    FOUND:
    {
        ClassNotFoundException e = null;
        for (String pkg : "java.lang.,java.util.,java.math.,".split(",",-1)) {
            try {
                clazz = Class.forName(pkg + className);
                break FOUND;
            } catch (ClassNotFoundException e2) {
                e = e2;
            }
        }
        throw new IllegalArgumentException(e);
    }
    try {
        Method valueOf = clazz.getMethod("valueOf", String.class);
        return (T) valueOf.invoke(null, text);
    } catch (Exception e) {
        try {
            Constructor<T> valueOf = clazz.getConstructor(String.class);
            return (T) valueOf.newInstance(text);
        } catch (Exception e2) {
            throw new IllegalArgumentException(e);
        }
    }
}

enum BuySell {
    BUY, SELL
}
public static void main(String... args) {
    for (String className : "String,Long,Double,BigDecimal".split(",")) {
        Object o = parseAs("1", className);
        System.out.println(className + " => " + o.getClass() + " as " + o);
    }
    Object o = parseAs("BUY", BuySell.class.getName());
    System.out.println("BuySell => " + o.getClass() + " as " + o);
}

版画

String => class java.lang.String as 1
Long => class java.lang.Long as 1
Double => class java.lang.Double as 1.0
BigDecimal => class java.math.BigDecimal as 1
BuySell => class Main$BuySell as BUY
于 2012-09-11T14:10:27.013 に答える
0

を探していClass.forName()ます。ただし、パッケージにはクラスの完全修飾名が必要です。

于 2012-09-11T14:10:21.607 に答える