我现在在tomcat里发布了2个工程项目,GBSS1,GBSS2
这两个工程里,有个同名的java类,比如是DBPass.java,这个类有一个静态方法叫 doSelect(),我现在发现一个奇怪的问题,我在操作GBSS2工程的菜单的时候,需要调用DBPss的doSelect()方法,按理说,应该调用GBSS2下的DBPss的doSelect()方法。但是,我通过debug追踪发现,程序却是调用的GBSS1的DBPss类的doSelect()方法。请帮我分析这是为什么哦?难道是跟静态方法有关?最好能从内存角度帮我分析下哦,谢谢

解决方案 »

  1.   

    我是这样理解的,不知道对不对,楼主可以做参考,
    1、当tomcat启动过后,可能是用两个线程来管管理两个不同的项目。
    2、所以两个项目所对应的class文件应该是“同时”被加载进内存的,也就是他们是被同一个类加载器加载进去的。 因此他们具有相同的命名空间,他们之间也就具备了数据通讯的条件了。
    3、static 关键字 对应的是类 的属性,不是某个对象的属性。也就是说,在同一个命名空间里面类的静态属性是全局共享的。
      

  2.   

    你看下你调用这个方法的bean,import的是不是GBSS2,是不是引入的时候写错了?
      

  3.   

    debug的时候指定项目代码就行了,如果debug到另一个项目的代码里去了,只能说明你指定debug的代码不对,但运行成什么样不会影响的。
    可以把另一个项目先关掉!
      

  4.   

    你使用MyEclipse开发的吧?我也经常发现这种问题,它会自动跳进另外一个工程的代码里面,只是你把那个工程关了就好了。我感觉可能是内存换乱造成的 
      

  5.   

    比如说你的TomCat容器同时加载了两个类,两个类完全相同,他会在内存里分配同一块空间,你运行程序的时候系统就会调用这个空间里的类,MyeclipseDebug的时候就会错误的跳到另外一个工程里面去
      

  6.   

    用的MyEclipse么?实际上调的方法可能没有错,错的是MyEclipse。你可以在两个方法里面打印些信息,看看到底是执行到哪个里面去了。