远程方法调用(RMI)机制可以把面向对象的思想进一步扩展,因为你可以调用的对象不仅可以在本机上,也可以在别的主机上。本文就简单介绍rmi的编程方法。
首先介绍一些简单的rmi的概念。
1, 和客户:在rmi中,如果有一个对象进行远程方法调用,这个对象就叫做客户机对象,而远程对象则被称为对象。
2, 创建服务器对象的服务器程序:这个程序用来创建服务器对象,注册这个对象,使得客户可以通过注册的名称访问服务器对象。
3, 接口(interface),接口可以让客户端了解服务器所能做的工作。更具体的说,就是它列出了可以在服务器上执行的所有方法。客户端程序必须能够找到这个类,否则就不能执行对服务器函数的调用。
4, 客户桩(stub),有的书中翻译成为代码存根,它给客户端程序提供一个桩,这个桩上”绑”着服务器对象。当客户程序需要调用远程对象时,这个桩被到客户端(如果客户端有这个类,则不需要)。然后客户就可以像调用本地方法一样调用远程的方法了。
这个客户桩的作用是将客户向服务器的请求进行编码、进行传输,服务器执行这次调用后将结果返回到客户桩,客户桩进行解码,将解码后的结果传送到客户程序中。对于编写客户端的程序员来说,他不需要知道其中的具体过程。
客户桩不需要自己编写,后面会说明它的生成方法。它实现了前述的接口(interface)。
下面就通过一个例子来说明编写的过程。更多…. Continue reading »
Class.forName(xxx.xx.xx) 返回的是一个类, .newInstance() 后才创建一个对象 Class.forName(xxx.xx.xx);的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段
Class aClass = Class.forName(xxx.xx.xx);
Object anInstance = aClass.newInstance();
Class.forName(”").newInstance()返回的是object
but there is some limit for this method to create instance
that is your class constructor should no contain parameters, and you should cast the instance manually.
Class Driver{
protected static Driver current;
public static Driver getDriver(){
return current;
}
}
Class MyDriver extends Driver{
static{
Driver.current=new MyDriver();
}
MyDriver(){}
}
用时:
Class.forName(”MyDriver”);
Driver d=Driver.getDriver();
有的jdbc连接数据库的写法里是Class.forName(xxx.xx.xx);而有一些:Class.forName(xxx.xx.xx).newInstance(),为什么会有这两种写法呢? Continue reading »
2007 年 7 月 05 日
Java™ 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。这两种机制的提出都是为了实现代码线程的安全性。其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低),而且其使用也更容易出错。在这期的 Java 理论与实践 中,Brian Goetz 将介绍几种正确使用 volatile 变量的模式,并针对其适用性限制提出一些建议。
Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized 的一部分。本文介绍了几种有效使用 volatile 变量的模式,并强调了几种不适合使用 volatile 变量的情形。
锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)。互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。可见性要更加复杂一些,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的 —— 如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前的值或不一致的值,这将引发许多严重问题。
Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性。这就是说线程能够自动发现 volatile 变量的最新值。Volatile 变量可用于提供线程安全,但是只能应用于非常有限的一组用例:多个变量之间或者某个变量的当前值与修改后值之间没有约束。因此,单独使用 volatile 还不足以实现计数器、互斥锁或任何具有与多个变量相关的不变式(Invariants)的类(例如 “start <=end”)。 Continue reading »
在js中可以将字符串转化为xml对象,可以使用如下函数
|
function createXml(str){ |
|
var xmlDoc = new ActiveXObject(”Msxml2.DOMDocument.3.0″); |
|
var domxml= createXml(Http.responseText); |
写了一段时间的flex程序,一开始的时候程序比较简单,不涉及到很多的事件和事务逻辑,所以一般用Alert来调试程序就够用了。随着程序越来越复杂,涉及到bug也越来越多,所以Debug显得很关键了。下面个大家介绍一下如何搭建Flex debug环境。(刚好找到有人写的,就粘贴过来了,)
下载地址。其他版本下载地址可以参考adobe网站。
1. 要具备debug功能,我们必须要首先安装Flash Player Debug 版本。
windows版本
2. 安装好debug版本后,我们还需要添加日志的配置文件mm.cfg。
该配置文件存放的目录如下:
Macintosh OS X MacH D:Library:Application Support:macromedia:mm.cfg
Microsoft Windows XP C:\Documents and Settings\user_name\mm.cfg
Windows 2000 C:\mm.cfg
Linux home/user_name/mm.cfg
以上是从官方文档中找来的,但实际上我用windows2000时,我的mm.cfg文件就是放在C:\Documents and Settings\user_name\mm.cfg下的,和xp一样。
配置文件的配置参数在这里列出:
ErrorReportingEnable 1: 打开error信息写入日志文件 0:关闭
MaxWarnings 设置waining信息记录最大数量,默认值为100,0:无限制
TraceOutputFileEnable 设置trace日志,1:为开,0:为关,默认值为0
TraceOutputFileName 设置trace日志文件位置,Fleah Player 9 Update版本后该属性设置已经没有用了。笔者也试验过确实没有用。输出文件名为flashlog.txt
mm.cfg例子文件:
ErrorReportingEnable=1
TraceOutputFileEnable=1
3. 输出的日志文件位置:
从Flash Player 9 Update开始,我们不能修改日志文件的位置了,默认的位置为:
Windows C:\Documents and Settings\user_name\Application Data\Macromedia\Flash Player\Logs
Macintosh Users/user_name/Library/Preferences/Macromedia/Flash Player/Logs/
Linux home/user_name/macromedia/Flash_Player/Logs/flashlog.txt
到这里你可以放心的用trace()函数进行数据跟踪了。
4. 这里有个例子:
<?xml version=”1.0″?>
<!– logging/ButtonLifeCycle.mxml –>
<mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml“>
<mx:Script><![CDATA[
private function traceEvent(event:Event):void {
trace(event.currentTarget + “:” + event.type);
}
]]></mx:Script>
<mx:Button id=”b1″ label=”Click Me”
preinitialize=”traceEvent(event)”
initialize=”traceEvent(event)”
creationComplete=”traceEvent(event)”
updateComplete=”traceEvent(event)”
/>
</mx:Application>
运行后如果输出一下内容到flashlog.txt文件的话,那么恭喜你成功了。
TraceLifecycle_3.b1:Button:preinitialize
TraceLifecycle_3.b1:Button:initialize
TraceLifecycle_3.b1:Button:creationComplete
TraceLifecycle_3.b1:Button:updateComplete
TraceLifecycle_3.b1:Button:updateComplete
TraceLifecycle_3.b1:Button:updateComplete