我门先来定义一个接口:
   package test;
   public interface Shape {
     public void draw();
   }
接着我们在定义2个实现类
   package  test;
   public class Circle implements shape {
     public void draw() {
        System.out.println(" circle draw");
     }
   }
   
  package test;
  public class Rectangle implements shape {
    public void draw() {
      System.out.println("rectangle draw");
    }
  }好,准备工作已经做好了,让我们开始吧.
package test;public MyTest{ public static void main(String args[]){
   try{
        String strConfigInfo=getConfigInfo();//getCofingInfo();是你的配置信息来源.可以是从
        Class cls = Class.forName(strConfigInfo); //文件中读取,也可以来自注册表.
        Shape shp = (Shape)cls.newInstance();
        shp.draw();
   }catch(Exception e){
     e.printStackTrace();
  }//end try_catch
 }//end main
}//end MyTest说明:1,如果你现在写了个Shape的实现类MyShape,你只要修改一下配置信息,使getConfingInfo()取的信息是你的类的包路径(包含包名在内的类名,如java.io.FileWriter),那么shp.draw();将会调用你所写类中的draw()方法了.    2, 如果您要写插件,这将将是非常有用的技术.(比c++/delphi 中的动态连接库要方便多了.)
问题是:
 那如果你要动态加载的类的构造器中有参数怎么办?? 
 

解决方案 »

  1.   

    你是问问题还是搞扫盲啊??
    问问题的话::java.lang.reflect.Constructor
    扫盲的话::GZ
      

  2.   

    relive(六道轮回,无想转生)结合上面的例子,用java.lang.reflect.Constructor怎么把参数传入类呢?
      

  3.   

    以JDialog的JDialog(Container c)构造器为例
    Class m_classdialog = java.lang.Class.forName("javax.swing.JDialog");
    java.lang.reflect.Constructor cons = m_classdialog.getConstructor(new Class[] { Container.class });
    Object m_objectdialog = cons.newInstance(new Object[] { parentContainer});
    JDialog myDialog = (JDialog) m_objectdialog;