Java中使用==比较Class<?>对象是否安全?Class实例是否唯一
Java中Class对象的==比较规则
核心规则
- 当同一个类被同一个类加载器加载时,对应的
Class<T>对象是全局唯一的,用==比较必然返回true。 - 若同一个类被不同类加载器加载,会生成独立的
Class<T>对象,此时==比较结果为false。
你的代码分析
你给出的代码里,STRING.getClass()和"Goodbye World".getClass()拿到的都是java.lang.String的Class对象。而String类是由JVM的引导类加载器负责加载的,整个JVM进程中只会存在一个String类的Class实例,所以a.theClass == a.theClass2的结果一定是true,这段代码不可能输出true以外的内容。
额外说明
Class类没有重写equals方法,所以它的equals方法和==的行为完全一致——都是直接比较对象引用。如果遇到跨类加载器的场景,要判断两个Class对象是否代表逻辑上的同一个类型,可以比较它们的全限定类名(比如调用getCanonicalName()),不过这种场景在常规业务开发中很少碰到,大多出现在自定义类加载器的场景里。
内容的提问来源于stack exchange,提问作者Govind Parmar
相关产品推荐
相关产品推荐

