接手别人的一个项目,今天发现一个类包含了HyPortDao这个接口,使用set注入该接口实现类。然后在类中调用了这个接口中的方法,看起来一切都很正常,可是我ctrl+单击这个接口,显示source not found,我在项目目录下也没找到这个接口及其实现类,可是确实可以调用这个接口中的方法(方法名改掉会报错)。private HyPortDao hypd;
public void setHypd(HyPortDao hypd) 
{
     this.hypd = hypd;
}//调用其方法
String voyageslinename=this.hypd.voyageslinename(参数略);这究竟是怎么回事?种种迹象表明貌似这个接口存在过,可是后来又蒸发了,但是它还可以使用!哦,spring注册文件中还有它的注册信息。<bean id="HyPortDaoImpl" class="com.times.domain.daoimpl.HyPortDaoImpl" parent="BaseDao">
    <property name="hyhm">
        <ref bean="HyHelpMethodImpl"/>
    </property>
</bean>

解决方案 »

  1.   

    不会的,因为这个接口的命名就是这个项目的,不会是第三方jar
      

  2.   

    肯定是有实现的,否则编译是通不过的,不要怀疑编译器。可能是没有源代码了,只有一个.class了。另外,你可以在IDE中search resources一下。还有就是打印这个对象的class,看看是不是用动态代理生成的.
      

  3.   

    search resources和打印对象class怎么操作?
      

  4.   

    就是把源代码中的this.hypd用system.out.println输出,看看到底调用的是什么类。至于搜索,直接用IDE中的搜索功能
      

  5.   

    ctrl+单击该接口后显示如下信息:Source not found
    // Compiled from HyPortDao.java (version 1.5 : 49.0, no super bit)
    public abstract interface com.times.domain.dao.HyPortDao {
      
      // Method descriptor #6 (Ljava/lang/String;)Ljava/lang/String;
      public abstract java.lang.String portlongname(java.lang.String arg0);
      
      // Method descriptor #6 (Ljava/lang/String;)Ljava/lang/String;
      public abstract java.lang.String portshortname(java.lang.String arg0);
      
      // Method descriptor #6 (Ljava/lang/String;)Ljava/lang/String;
      public abstract java.lang.String voyageslinename(java.lang.String arg0);
      
      // Method descriptor #10 (Ljava/lang/String;Ljava/lang/String;)Lcom/times/util/HyTwoStringForSelect;
      public abstract com.times.util.HyTwoStringForSelect getthevoyagessegment(java.lang.String arg0, java.lang.String arg1);
      
      // Method descriptor #12 (Ljava/lang/String;)Ljava/util/List;
      // Signature: (Ljava/lang/String;)Ljava/util/List<Lcom/times/util/HyTwoStringForSelect;>;
      public abstract java.util.List getvoyagessegment(java.lang.String arg0);
      
      // Method descriptor #16 (Ljava/lang/String;)Lcom/times/domain/model/HyPort;
      public abstract com.times.domain.model.HyPort getthehyportbyportcode(java.lang.String arg0);
      
      // Method descriptor #12 (Ljava/lang/String;)Ljava/util/List;
      // Signature: (Ljava/lang/String;)Ljava/util/List<Lcom/times/domain/model/HyPort;>;
      public abstract java.util.List getthehyportlistbyline(java.lang.String arg0);
      
      // Method descriptor #12 (Ljava/lang/String;)Ljava/util/List;
      public abstract java.util.List getcodenamebyline(java.lang.String arg0);
      
      // Method descriptor #12 (Ljava/lang/String;)Ljava/util/List;
      // Signature: (Ljava/lang/String;)Ljava/util/List<Lcom/times/util/HyTwoStringForSelect;>;
      public abstract java.util.List getcodenamebylineframe(java.lang.String arg0);
      
      // Method descriptor #12 (Ljava/lang/String;)Ljava/util/List;
      // Signature: (Ljava/lang/String;)Ljava/util/List<Lcom/times/util/HyTwoStringForSelect;>;
      public abstract java.util.List getcodeinamebylineframe(java.lang.String arg0);
      
      // Method descriptor #23 ()Ljava/util/List;
      public abstract java.util.List getallport();
      
      // Method descriptor #23 ()Ljava/util/List;
      // Signature: ()Ljava/util/List<Lcom/times/util/HyTwoStringForSelect;>;
      public abstract java.util.List getallcodenameport();
    }
      

  6.   

    在项目文件夹中搜索.class文件,没有发现有这个类
      

  7.   

    很明显,IDE找不到对应的源代码,只是通过CLASS文件反编译出来的东西。这个接口和实现肯定是.class文件,或是已打包成jar。你要找开发的人要源代码。
    源代码文件被误删除,这种事情是经常发生的,尤其是在一些维护性项目。如果项目是有版本控制的,如CVS,可以看看CVS的历史。
      

  8.   

    System.out.println(this.hypd);
    显示com.times.domain.daoimpl.HyPortDaoImpl@27738
      

  9.   

    对象确实被实例化了,证明我的推断是正确的。如果com.times.domain.daoimpl包中找不到HyPortDaoImpl就表示接口和实现类的源代码被删除掉了
      

  10.   

    点开elipse左边package explore上面有一个link开关,再ctrl点那个文件,出来的东西因为没有源码所以显示你描述的样子,但是左边会同步定位到该类所在的位置,应该是在jar包中