dynamic proxy 在 java rmi 中的应用
forest hou
2000年9月6日,rickard oberg (jboss 的主要作者之一) 在rmi-users 邮件组贴了一个标题为 "howto: use dynamic proxies as rmi stubs + howto: export dynammic proxies as rmi objects" 的贴子, 展示了dynamic proxy 如何用在java rmi 中。利用这项技术,程序员可以在rmi中加入各种服务 (authentication, logging, transaction 等等) 而不改变rmi的 interface。这一技术是jboss实现ejb模型的关键。本文详细介绍了这一技术。rickard曾用"smartworld"展示这一技术,并放在他的网站上供下载。遗憾的是我们今天已经无法看到smallworld了。笔者调通了rickard帖子中的例子,称之为"smallworld",在本文中讲解。读者可以下载这个例子。
在rmi中加入interceptor
我非常喜欢java rmi。相对于其他的分布式对象模型 (corba, com) ,rmi 显得很轻,很简单。但是有时候程序员想在rmi中加入各种服务(service)而不改变其interface,却不是那么简单。"interceptor"作为一种重要的"design pattern"在现代软件技术中非常流行,它通常用来实现service,因此是实现framework的关键技术之一。
下面是一个非常简单的rmi例子。我要在这个例子上加入interceptor,用以展现神奇的dynamic proxy技术。
//: smallworld interface
public interface smallworld extends java.rmi.remote
{
public static final string name = "smallworld";
public string hello(int i) throws java.rmi.remoteexception;
}
smallworld 是一个简单的rmi interface,其中只定义了一个方法hello()。
//: smallworldimpl
import java.rmi.server.*;
import java.rmi.*;
public class smallworldimpl extends unicastremoteobject implements smallworld
{
public smallworldimpl() throws remoteexception {
super();
}
public string hello(int i) throws java.rmi.remoteexception
{
system.out.println("in smallworldimpl i = " + i);
return ("hello number=" + i);
}
}
smallworldimpl是smallworld interface 的实现。这是一个再标准不过的rmi实现,你可以在任何rmi教科书中找到类似的例子。
client的实现如下:
//: client
import java.rmi.*;
public class test
{
public static void main(string[] args)
{
try {
smallworld he =(smallworld)naming.lookup(smallworld.name);
system.out.println(he.hell
闽公网安备 35060202000074号