//接口
public interface Point{
  public int getX();
  public int getY();
  public void move(int dx,int dy);}
//管理PointImpl新旧版本的关系
import java.net.*;public class PointServler{
static ClassLoader cl;
static Class ptClass;
public static synchronized  Point createPoint(Point template)throws Exception{
if(ptClass==null)reloadImpl();
Point newPt=(Point)ptClass.newInstance();
if(template!=null){
newPt.move(template.getX(),template.getY());
}
return newPt;
}
public static synchronized void reloadImpl()
throws Exception{
URL[] serverURLs=new URL[]{new URL("file:subdir/")};
cl=new URLClassLoader(serverURLs);
ptClass =cl.loadClass("PointImpl");
}
}
import java.io.*;
public class   PointClient{
static Point pt;
public static void main(String[] args)throws Exception
{
BufferedReader br=new BufferedReader(
new InputStreamReader(System.in));
pt=PointServler.createPoint(null);
System.out.println(pt);
while(true){
System.out.println("Move ,Reload,or Exit");
String cmd=br.readLine();
if(cmd.equals("Reload")){
PointServler.reloadImpl();
pt=PointServler.createPoint(pt);
System.out.println(pt);
}
else if(cmd.equals("Move")){
pt.move(1,1);
System.out.println(pt);
}
else if(cmd.equals("Exit")){
return;
}
         }
       }
}
public class PointImpl implements Point{
private int x;
private int y;
public int getX(){
return x;
}
public int getY(){
return y;
}
public void move(int dx,int dy){
x+=dx;
                 // y+=dy;
}
public String toString(){
return "Point at"+x+","+y;
}
}
其中Point,PointServler,PointClient放在顶层目录,PointImpl放在subdir中
第一次运行时,把//y+=dy注释,
在运行PointClint时,把//y+=dy 改为y+=dy;再编译,但是PointImpl中Move时结果还是不变