根据输入的String值返回Class变量

时间:2012-09-11 14:08:04

标签: java class generics methods

我想创建一个接受字符串参数并返回该类型的类的方法。

例如如果我通过Long,则应返回Long.class

psudo代码:

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

修改:问题是我的值只有"String"。不是"java.lang.String"

Edit2:我在String中有一个变量。我想把它投到上面的课上。 对于例如 字符串值=“1”; String type =“Long”; 我想要这样的东西(psudo代码):

value = (classReturn(type)) value ;

3 个答案:

答案 0 :(得分:1)

return Class.forName(className);

关于您的编辑,您不能将字符串值“强制转换”为长值。为了将字符串值转换为其他类型,您需要更复杂的内容,例如this

答案 1 :(得分:1)

您可以使用

Class.forName(className);

如果您使用短类名,则需要实现类似

的路径

最接近转换字符串的方法是假设某些约定,例如valueOf或带有String的构造函数。

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

答案 2 :(得分:0)

您正在寻找Class.forName()。但是,您需要使用包的类的完全限定名称。