所有的类放在duotai包中,问题在最后一个程序的红色标出。类Module 
class Module {
private Dialog dialog;
public Module(Dialog dialog) {
this.dialog = dialog;
}
public void callDialog() {
dialog.show();
}
}
抽象类Dialog
abstract class Dialog {
public Dialog() {

}
abstract public void show();
}
Dialog派生的子类Dialog1class Dialog1 extends Dialog {
public Dialog1() {

}
public void show() {
System.out.println("Dialog1");
}
}
Dialog派生的子类Dialog2class Dialog2 extends Dialog {
public Dialog2() {

}
public void show() {
System.out.println("Dialog2");
}
}
启动类
public class DialogTest {
public static void main(String[] args) throws Exception {
//从文件中读取类名
                FileInputStream in = null;
in = new FileInputStream("C:\\a.txt");  //该文本文件中存储的是duotai.Dialog2
byte[] buffer = new byte[1024];
int length = in.read(buffer);
String className = new String(buffer,0,length);  //读取类名,存储在字符串中
System.out.println(className);
in.close();
                
//String className = "duotai.Dialog2";
Class c = Class.forName(className);
Constructor con = c.getConstructor(new Class[]{});
Object obj = con.newInstance();     //反射得到obj想要做为参数传递给Module构造方法,生成一个Module对象

//Dialog2 dialog = new Dialog1();
//Module mol = new Module(dialog);
                //想用下面代码实现上面被注释掉的两条代码的功能,但是把obj转换成Dialog2之后才能传给Module构造方法
                  //怎么才能不在程序中体现Dialog2??
Module mol = new Module((Dialog2)obj);
mol.callDialog();
}
}

解决方案 »

  1.   

    为什么一定要转成Dialog2,你不是写提Dialog吗?你现在利用反射要完成的工作就是利用配置文件来控制实例方法,这你只需要将你想用到的实例方法放到基类里就行了。在Module传递的是Dialog对象,但是实际生成实例的时候,你可以传递Dialog子类实例。
    似乎说得有点乱,不知道说清楚了没?
      

  2.   

    嗯,我后来也发现我的程序写的有问题,其实Module里面直接写一个父类过去就可以了,Dialog。完全可以实现,但是既然遇到了这个问题,就想把它弄明白,如果真是想强制转换类型的话,而这个类型又不能预知的,应该怎么转换呢?
      

  3.   

    Class<Dialog> c = (Class<Dialog>)Class.forName(className);//Class是一个范型类,这样可以得到Dialog的Class
    Dialog dia = c.newInstance();
    Module mol = new Module(dia);
    没有体现Dialog2!
      

  4.   

    1、3楼说的都对,我的问题有毛病了,它是可以通过父类Dialog来解决这个问题的。那如果Dialog2不继承Dialog,又应该怎么修改呢?
      

  5.   

    如果Dialog2不继承Dialog,那么Module 的构造方法就不能传Dialog2了,若强制转换会抛异常。