反射如何检查类是否属于JavaJDK
我使用一个外部库,它返回一些List<?>
。
我需要检查这个列表中的每个对象是否都是JDK的对象(String、int、Integer…)。
这是正确的解决方案吗
List<?> list = externalLibrary.search(...);
for(clazz : list) {
if (clazz.getPackage().getName().startsWith("java.lang"))
// do something different
}
有更好的吗
# 1 楼答案
这取决于你对“JDK对象”的定义——它的边缘可能会变得非常模糊——不,这是不行的。
java.lang
包只是JDK中包含的所有类中的一小部分您可以检查每个对象是否由加载
ClassLoader
的相同java.lang.String
加载——即一般来说,系统类和应用程序类将使用不同的
ClassLoader
# 2 楼答案
我认为一个更简单的解决办法是这样: 编写一个方法来标识您定义的所有类。在大多数情况下,所有用户定义的类都遵循com这样的模式。某物某物如果它们不属于com。某物这是一个JDK类
# 3 楼答案
您可以使用
ClassLoader.getSystemResources
,然后检查类是从哪个jar加载的(例如,如果它来自rt.jar)您将获得URL,例如:
示例代码取自SLF4j:
# 4 楼答案
我们使用下面的类来检查这些类是否属于JDK
# 5 楼答案
就我个人而言,我喜欢类加载器基本答案。但在StringBuilder上,它也将返回真值。如果您想要更窄的定义,即仅为“内置”类型,那么可以尝试评估这是基元类型(如int)还是包装类型(如Integer)或字符串。你可以这样写:
您还可以选择添加对
java.math.BigDecimal
、java.util.Date
、java.sql.Timestamp
等类的支持。但是请注意,它们不是最终的,所以我假设如果有人以琐碎的方式扩展它们,它将不会被视为JDK类# 6 楼答案
可能没问题,只需检查以下软件包:
也许其他人