为你的应用程序添加动态Java代码

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

摘要

你曾经希望你的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(" Postman " + 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

}

}

执行这个应用程序,输入一些信息,你将看到控制台输出如下(你可以下载该例子并自行运行):

DynaCode Init class sample.PostmanImpl

Enter a message: hello world

Postman hello world

Enter a message: what a nice day!

Postman what a nice day!

Enter a message:

现在让我们来看看动态的东西。 不要停止应用程序,让我们修改PostmanImpl的源码。新的执行程序将会把所有的信息输出到一个文本文件,而不是控制台。

// MODIFIED VERSION

public class PostmanImpl implements Postman {

private PrintStream output;

// Start of modification

public PostmanImpl() throws IOException {

output = new PrintStream(new FileOutputStream("msg.txt"));

}

// End of modification

public void deliverMessage(String msg) {

output.println(" Postman " + msg);

output.flush();

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航