Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 根据输入字符串值返回类变量_Java_Class_Generics_Methods - Fatal编程技术网

Java 根据输入字符串值返回类变量

Java 根据输入字符串值返回类变量,java,class,generics,methods,Java,Class,Generics,Methods,我想创建一个接受字符串参数并返回该类型类的方法 例如,如果我通过Long,它应该返回Long.class psudo代码: private Class<?> classReturn(String className){ return new Class<className>; } value = (classReturn(type)) value ; 关于编辑,不能将字符串值“强制转换”为长值。为了将字符串值转换为其他类型,您需要更复杂的东西,例如。您正在查找Clas

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

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

psudo代码:

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

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

您正在查找
Class.forName()
。但是,您需要类的完全限定名以及包。

您可以使用

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);
}

我认为从上下文类加载器加载比Class.forName()更好。它能保持永久性clean@Chris如果您使用自定义类和多个类装入器,这是一个好主意。那么Character类呢?它没有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