问题是这样的,
一个类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)
一个类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)
B是Common的继承类,里面只有Common定义的成员变量和方法
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);
}
Common d=null;
if(args[0].equals("Car007")){
d=new pkg1.Car007();
}
if(args[0].equals("Plane")){
d=new Plane();
}
则编译A的时候,会编译Car007和Plane类.建议:还是使用动态加载的形式(你原来的写法),自己手动编译一下那些Common的实现类么。呵呵.