我的情况非常令人困惑,正在寻找任何想法。
我正在运行一个小型Spring MVC应用程序,在其中使用了控制器“ AnsController ”上的RequestMapping批注。当RequestDispatcher在我的bean上扫描RequestMapping批注时,有时会归结为这一行:
clazz.getAnnotation(RequestMapping.class) (clazz = AnsController.class)
即使在上面的行也找不到注释。
我开始在Eclipse调试器中对此进行调查,发现了一个非常令人困惑的问题。上一行失败的原因是b / c RequestMapping.class返回了一个Class对象,该对象似乎描述了正确的批注,但是内部ID和hashCode与存储在AnsController.class批注数组中的Class对象不同。
我编写了一个测试servlet,在其中放置了上面的代码行,并且可以看到存储在注释数组中的Class和RequestMapping.class返回的Class是同一对象。
但是在RequestDispatcher Servlet中,RequestMapping.class似乎为相同的注释实例化了Class的另一个实例(我可以告诉b / c内部ID远高于注释映射中Class对象的ID )。
换句话说,与在RequestDispatcher Servlet中调用完全相同的代码相比,在我的Test Servlet中调用RequestMapping.class会导致不同的Class对象。
假设正在使用相同的类加载器,这是否有可能?是否有足够的证据得出这样的结论,即应该由不同的类加载器生成应该代表一个同一个批注的Class对象的这些不同实例?
我找不到任何书面形式可以证实我的假设,即每个类只允许一个Class对象实例,但这似乎是合理的……还是我错了吗?
似乎是合理的,是的,但是不幸的是,它并不总是那样工作。答曰Java语言规范 :
在运行时,Java虚拟机使用类加载器加载类和接口。每个类加载器定义自己的一组类和接口。结果,两个加载程序有可能加载相同的类或接口定义,但在运行时生成不同的类或接口。