gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 16:16:12 25 4
gpt4 key购买 nike

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

我正在运行一个小型 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com