导流关键词:Java,String转基本类型包装类
根据 (百度知道) 如何将String类型转换成任意基本类型 的答主 僵尸妹也很萌 写的Java代码做了进一步加强与拓展。
原代码:
// 例子 cast(Long.class,"1001")
public <T> T cast(Class<T> cls,String value) throws Exception{
return (T)cls.getConstructor(String.class).newInstance(value);
}
更新与加强:
MyReflectUtils.class (关键函数是“cast”)
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;
import java.net.JarURLConnection;
import java.net.URL;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
/**
* 这是一个通过Java反射机制获取变量的一个工具类
* 方便获取类的字段名称,同时极大地减少字段以常量字符串形式写死在程序里
*/
public class MyReflectUtils {
public static final HashMap<String, Class<?>> typeDic = new HashMap<>();
static {
typeDic.put(int.class.getName(), Integer.class);
typeDic.put(double.class.getName(), Double.class);
typeDic.put(float.class.getName(), Float.class);
typeDic.put(long.class.getName(), Long.class);
typeDic.put(short.class.getName(), Short.class);
typeDic.put(byte.class.getName(), Byte.class);
typeDic.put(boolean.class.getName(), Boolean.class);
typeDic.put(char.class.getName(), Character.class);
}
/**
* String 转 任意基本类型的包装类
*
* @param cls 基本类型
* @param value String字符串
* @return 基本类型的包装类的对象
* @throws Exception 请务必保证目标类型有把String转成目标类型的构造方法
*/
@SuppressWarnings("unchecked")
public static <T> T castToWrapperClassObject(Class<T> cls, String value) throws Exception {
Class<?> wrapperClass = typeDic.get(cls.getName());
if (wrapperClass == null) {
return cls.getConstructor(String.class).newInstance(value);
}
return (T) wrapperClass.getConstructor(String.class).newInstance(value);
}
}
ReflectTest.class (测试)
import com.github.xfl12345.jsp_netdisk.model.utils.MyReflectUtils;
import java.lang.reflect.Field;
public class ReflectTest {
public int k = 123;
public static void main(String[] args) throws Exception {
ReflectTest reflectTest = new ReflectTest();
MyReflectUtils myReflectUtils = new MyReflectUtils();
Field field = reflectTest.getClass().getDeclaredField("k");
//获取 field字段 的 类型
System.out.println( field.getType() );
//将 "12345" 转换成 和 field 类型一致的 对象
System.out.println( ( myReflectUtils.cast(field.getType(), "12345")) );
//看看所谓的 “和 field 类型一致的 对象” 究竟是什么类型(究竟转换成什么类型了)
System.out.println( ( myReflectUtils.cast(field.getType(), "12345")).getClass().getTypeName() );
//给定输入值 是 字符串类型的 "12345" ,把转换结果赋值到 field 字段
field.set( reflectTest, myReflectUtils.cast(field.getType(), "12345") );
//查看 field 字段 当前的值
System.out.println("k=" + reflectTest.k );
}
}
运行结果
int
12345
java.lang.Integer
k=12345
熟肉,东西全是现成的。可以直接拿去用。