首先,泛型部分Class<?>在这里真的无关紧要。当然,没有原始类型,因此Class<?>比 Class 更好,但是对于您的问题,通配符无关紧要。所以本质上,您是在问 Class 对象是否不可变。出于所有实际目的,它们确实如此。当类加载器加载一个类时,类对象就存在了,除非整个类加载器被卸载,并且所有的东西都被它加载,否则它们会一直存在。当这样的类对象仍在某处的地图中使用时,这不会发生。另一方面:Class.forName()对于已经加载的类不应该太昂贵。当诸如序列化之类的事情发挥作用时,人们建议使用 String 而不是 Class 对象,例如(参见此处)。必须区分类对象的不可变标识和属于该类的实际“代码”。该代码可以在运行时更改(通过检测,想想代码的热交换)。但是类名及其每个代码以及equals()相等性不应受此影响。因为“身份”保持不变。最后一点:正如下面有趣的评论所示,有一些方法可以在一定程度上改变Class 对象。但所有这些活动都绝对是“不正常的”。因此:理论上,您可能更喜欢字符串而不是 Class 对象,但实际上,在“普通”应用程序中,使用 Class 也应该可以正常工作。