个人而言,我喜欢基于类加载器的答案。但它也会在 StringBuilder 上返回 true。如果你想要更狭义的定义,即仅限于“内置”类型,你可以尝试评估这是否是原始类型(如 int)或包装类型(如 Integer)或 String。你可以编写类似这样的代码:
import java.util.Map;
import java.util.TreeMap;
public class Utils {
private static Map<String, Class<?>> SUBST_MAP = new TreeMap<String, Class<?>>();
private static Map<String, Class<?>> SIMPLE_MAP = new TreeMap<String, Class<?>>();
static {
SUBST_MAP.put(Byte.class.getName(), Byte.TYPE);
SUBST_MAP.put(Short.class.getName(), Short.TYPE);
SUBST_MAP.put(Integer.class.getName(), Integer.TYPE);
SUBST_MAP.put(Long.class.getName(), Long.TYPE);
SUBST_MAP.put(Float.class.getName(), Float.TYPE);
SUBST_MAP.put(Double.class.getName(), Double.TYPE);
SUBST_MAP.put(Boolean.class.getName(), Boolean.TYPE);
SUBST_MAP.put(Character.class.getName(), Character.TYPE);
SIMPLE_MAP.put(String.class.getName(), Boolean.TRUE);
}
public static Class<?> getClassType(Object arg, boolean substPrimitiveWrapper){
Class<?> classType = null;
String className = null;
Class<?> substClass = null;
if(arg != null ){
classType = arg.getClass();
if(substPrimitiveWrapper){
className = classType.getName();
substClass = (Class<?>)SUBST_MAP.get(className);
if(substClass != null){
classType = substClass;
}
}
}
return classType;
}
public static boolean isJDKClass(Object arg){
Class<?> classType = getClassType(arg, true);
boolean isJDKClass = false;
if(classType!=null){
assert classType!=null;
String className = classType.getName();
Boolean isFound = (Boolean)SIMPLE_MAP.get(className);
if(Boolean.TRUE.equals(isFound)){
isJDKClass = true;
}
boolean isPrimitiveType = classType.isPrimitive();
if(isPrimitiveType){
isJDKClass = true;
}
}
return isJDKClass;
}
}
您还可以选择添加对
java.math.BigDecimal
、
java.util.Date
和
java.sql.Timestamp
等类的支持。但请注意,它们并不是最终版本,因此我假设如果有人即使以
微不足道的方式扩展了它们,也不会被视为JDK类。
javax
、sun
、com.sun
或甚至oracle
、com.oracle
开头的包。 - ThomasString
、Date
、BigInt
、BigDecimal
等返回值(你几乎肯定只会从数据库中获得“数据类型”类,没有内置核心类、集合、Swing类等)。因此,你最可能只有一组最多20个需要检查匹配的类/类型。 - Thomasclazz.equals(String.class)
对6-10种Java类型进行测试比使用clazz.getPackage().getName().startsWith("java.lang")
更好吗? - yves amsellem