原来一直以为,JAVA程序都必须在执行前被编译,而不是在运行时可以动态加载,看了这篇文章后,才知道这么一回事,看来JAVA里面的东西没有熟悉还有的是,不要以人好像什么都懂都了。
作者:Amydeng;… 文章来源:matrix
摘要
你曾经希望你的java代码能够像JSP一样是动态的吗?它可以在运行时被修改和重新编译,同时你的应用程序自动更新。本文阐述了如何让你的代码动态化。同样的,你的一些源代码将会被直接部署,而不是编译好的字节码。这些源代码的任何改变都将引起这些源代码的再编译和类的重新装载。然后你的应用程序就会运行在新的类上,用户将立即看到这种改变。本文不仅讲述了运行时源码编辑和类装载,而且还提出一个将动态代码与其调用者分离的设计方案。调用者保存对动态代码的一个静态引用,而不管动态代码运行时如何再次装载,调用者总能访问最新的类且不用更新引用。这样,动态代码改变对客户是透明的。
JSP是一种比servlets更有弹性的技术,因为它可以响应运行时的动态改变。你可以想象一个普通的java类也有这种动态的能力吗?如果你能修改服务的执行而不用重新部署和更新应用程序,将会是很有趣的。
文章说明了如何编写动态的代码。它讨论运行时源码编辑,类的再装载,和让动态类的修改对它的调用者透明的代理设计模式。
版权声明:任何获得Matrix授权的网站,转载时请务必保留以下作者信息和链接
作者:Li Yang;Amydeng
原文:http://www.javaworld.com/javaworld/jw-06-2006/jw-0612-dynamic.html
Matrix:http://www.matrix.org.cn/resource/article/44/44615_Java+Dynamic+Code.html
关键字:Java;动态代码
一个动态java代码的例子
让我们以一个动态java代码的例子开始来阐释真正的动态代码意味着什么,为下文的讨论做铺垫。请在源码中找到这个例子完整的源代码。
这个例子是一个简单的依靠名叫Postman的服务的java应用程序。Postman服务是一个java接口,仅包括一个方法,
deliverMessage():
public interface Postman {
void deliverMessage(String msg);
}
这项服务的简单执行是向控制台打印消息。执行类是动态的代码。这个类,PostmanImpl,仅是一个普通的 java类,如果不是展开它的源码代替它的已编译好的二进制码:
public class PostmanImpl implements Postman {
private PrintStream output;
public PostmanImpl() {
output = System.out;
}
public void deliverMessage(String msg) {
output.println(" " + msg);
output.flush();
}
}
使用Postman服务的应用程序如下。在main()方法里,循环从控制行读取消息并通过Postman服务进行传递:
public class PostmanApp {
public static void main(String[] args) throws Exception {
BufferedReader sysin = new BufferedReader(new InputStreamReader(System.in));
// Obtain a Postman instance
Postman postman = getPostman();
while (true) {
System.out.print("Enter a message: ");
String msg = sysin.readLine();
postman.deliverMessage(msg);
}
}
private static Postman getPostman() {
// Omit for now, will come back later
}
}
执行这个应用程序,输入一些