java - java 'class' 文字如何为同一类返回 Class 对象的不同实例?

标签 java annotations classloader

我遇到了一个极其令人困惑的情况,正在寻找任何想法。

我正在运行一个小型 Spring MVC 应用程序,我在 Controller “AnsController”上使用 RequestMapping 注释。当 RequestDispatcher 扫描我的 bean 中的 RequestMapping 注释时,在某些时候它会归结为这一行:

clazz.getAnnotation(RequestMapping.class)

(clazz = AnsController.class)

上面的行没有找到注释,即使它在那里。

我开始在 Eclipse 调试器中对此进行调查,发现了一个非常令人费解的问题。上面一行失败的原因是 b/c RequestMapping.class 返回一个 Class 对象,该对象似乎描述了正确的注释,但具有与存储在 < 中的 Class 对象不同的内部 id 和 hashCode AnsController.class 上的 em>annotations 数组!

我编写了一个测试servlet,其中放置了上面的代码行,我可以看到存储在annotations数组中的类以及RequestMapping.class返回的类> 是同一个对象。

但是在 RequestDispatcher servlet 中,RequestMapping.class 似乎为同一注释实例化了该类的另一个实例(我可以告诉 b/c 内部 id 是高于注释映射中Class对象的id)。

换句话说,在我的 Test Servlet 中调用 RequestMapping.class 会产生与在 RequestDispatcher servlet 中调用完全相同的代码不同的 Class 对象。

假设使用相同的类加载器,这是否可能?这是否足以得出这样的结论:这些不同的 Class 对象实例应该表示一个相同的注释,必须由不同的类加载器生成?

我找不到任何书面内容来证实我的假设,即每个类只允许有一个 Class 对象实例,但这似乎是合理的......还是我错了?

最佳答案

这似乎很合理,是的,但不幸的是它并不总是这样。引用Java Language Specification:

At run-time, classes and interfaces are loaded by the Java virtual machine using class loaders. Each class loader defines its own set of classes and interfaces. As a result, it is possible for two loaders to load an identical class or interface definition but produce distinct classes or interfaces at run-time.

关于java - java 'class' 文字如何为同一类返回 Class 对象的不同实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7265382/

相关文章:

java - RESTEasy 返回的集合中的根元素名称

java - Jooq如何根据组合键查询实体

java - 如何从 native SQL 查询中绑定(bind)实体对象中的 @Transient 字段

java - Orika 在使用嵌入式 tomcat 的情况下使用了错误的类加载器

java - 类加载器的委托(delegate)模型如何确保加载唯一的类?

java - Mac OSX 上的 Intellij 不显示 javadoc

java - Time4j:显示一年中的所有天

java - 在 JAVA 中使用注释加载启动

带有@MappedSuperclass 的 hibernate TABLE_PER_CLASS 不会创建 UNION 查询

java - 如何配置/创建自定义类路径,与jetty中许多Web应用程序中的少数几个一样常见