问题是这样的,
一个类A调用了一个接口Common,放在包pk1.pk2内
Comman有继承类B,放在包pk1内
A中相关的语句为:Common cn = (Common)Class.forName("pk1.B").newInstance();
                 cn.B中的方法;但是编译完A之后,却发现B没有得到编译,且系统显示找不到类pk1.B后来,我想办法在A中直接调用B,将B编译成class文件之后,程序才找到了pk1.B,得以运行正常。也就是说,以这种方法不能使这些继承类得到编译,为什么呢?
(本来我的目的是使继承类与类A和接口Common分离,以后再增加继承类,不需要更改A和Common)

解决方案 »

  1.   

    B中没有调用A啊
    B是Common的继承类,里面只有Common定义的成员变量和方法
      

  2.   

    先编译B,再编译A,B编译不了与你的编译设置有关,楼主是如何编译的?
      

  3.   

    javac A问题关键在于只编译A对B不产生任何作用而将B单独编译(虽然,也是在A的环境下采取的间接办法)得到class文件之后,才能正常运行A下面附上源程序:ComputerTime.java 源程序:
      import pkg1.pkg2.*;
      import java.lang.*;
      public class ComputerTime
      {  public static void main(String args[])
        {  System.out.println("交通工具: "+args[0]);
          System.out.println(" 参数A: "+args[1]);
          System.out.println(" 参数B: "+args[2]);
          System.out.println(" 参数C: "+args[3]); 
          double A=Double.parseDouble(args[1]); 
          double B=Double.parseDouble(args[2]); 
          double C=Double.parseDouble(args[3]);
          double v,t;
          try { Common d=(Common) Class.forName("pkg1."+args[0]).newInstance(); 
           v=d.runtimer(A,B,C);
           t=1000/v;
           System.out.println("平均速度: "+v+" km/h"); 
           System.out.println("运行时间:"+t+" 小时"); 
           }
          catch(Exception e) 
          { System.out.println("class not found");
          }
        }
      }
      
      包pkg1中Car007.java的源程序:
      package pkg1;
      import pkg1.pkg2.*;
      public class Car007 implements Common
      { public double runtimer(double A,double B,double C)
       {  System.out.println("runtime="+(A*B/C)); 
         return A*B/C;
       } 
      }  包pkg1中Plane.java的源程序:
      package pkg1;
      import pkg1.pkg2.*;
      public class Plane implements Common
      {
       public double runtimer(double A,double B,double C)
       {
        return A+B+C;
       } 
      }  包pkg2中Common.java的源程序:
      package pkg1.pkg2;
      public interface Common
      { double runtimer(double A,double B,double C);
      } 
      

  4.   

    因为你这里用的是Class.forName().
      

  5.   

    >>try { Common d=(Common) Class.forName("pkg1."+args[0]).newInstance(); 假如你把它改成类似与如下形式:
    Common d=null;
    if(args[0].equals("Car007")){
      d=new pkg1.Car007();
    }
    if(args[0].equals("Plane")){
      d=new Plane();
    }
    则编译A的时候,会编译Car007和Plane类.建议:还是使用动态加载的形式(你原来的写法),自己手动编译一下那些Common的实现类么。呵呵.