博文

目前显示的是 十二月, 2009的博文

Class.forName用途及与new辨析

Class.forName(xxx.xx.xx) 返回的是一个类 首先你要明白在java里面任何class都要装载在虚拟机上才能运行。这句话就是装载类用的(和new 不一样,要分清楚)。 至于什么时候用,你可以考虑一下这个问题,给你一个字符串变量,它代表一个类的包名和类名,你怎么实例化它?只有你提到的这个方法了,不过要再加一点。 A a = (A)Class.forName("pacage.A").newInstance(); 这和你 A a = new A(); 是一样的效果。 关于补充的问题 答案是肯定的,jvm会执行静态代码段,你要记住一个概念,静态代码是和class绑定的,class装载成功就表示执行了你的静态代码了。而且以后不会再走这段静态代码了。 Class.forName(xxx.xx.xx) 返回的是一个类 Class.forName(xxx.xx.xx);的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段 动态加载和创建Class 对象,比如想根据用户输入的字符串来创建对象 String str = 用户输入的字符串 Class t = Class.forName(str); t.newInstance(); 在初始化一个类,生成一个实例的时候,newInstance()方法和new关键字除了一个是方法,一个是关键字外,最主要有什么区别?它们的 区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类。那么为什么会有两种创建对象方式?这主要考虑到软件的可伸缩、可扩展和可重用 等软件设计思想。 Java中工厂模式经常使用newInstance()方法来创建对象,因此从为什么要使用工厂模式上可以找到具体答案。 例如: class c = Class.forName(“Example”); factory = (ExampleInterface)c.newInstance(); 其中ExampleInterface是Example的接口,可以写成如下形式: String className = "Example"; class c = Class.forName(className); factory = (ExampleInterface)c.newInstance(...

拜占庭将军问题 The Byzantine Generals Problem

拜占庭帝国就是5~15世纪的东罗马帝国,拜占庭即现在土耳其的伊斯坦布尔。我们可以想象,拜占庭军队有许多分支,驻扎在敌人城外,每一分支由各自 的将军指挥。将军们只能靠通讯员进行通讯。在观察了敌人以后,忠诚的将军们必须制订一个统一的行动计划——进攻或者撤退。然而,这些将军中有叛徒,他们不 希望忠诚的将军们能达成一致,因而影响统一行动计划的制订与传播。问题是:将军们必须有一个协议,使所有忠诚的将军们能够达成一致,而且少数几个叛徒不能 使忠诚的将军们做出错误的计划——使有些将军进攻而另一些将军撤退了。 抽象出来,可以表述成: 拜占庭将军问题 :设计一个协议,一个司令要送一个命令给他的n-1个副官,使得 IC1. 所有忠诚的副官遵守同一个命令。 IC2. 假如司令是忠诚的,则每一个忠诚的副官遵守他送出的该命令。 约定:忠诚的将军将遵守协议,而叛徒则可能破坏协议,尽可能的干绕其它人的判断。叛徒是匿名的。而且最后不需要确定谁是叛徒。 注意司令也有可能是叛徒,所以IC2与IC1是不同的。 递归设计协议OM(n, m)为 OM(n, 0): 司令发送命令给所有副官。 副官按照接收到的命令行事。 OM(n, m): 司令发送命令给所有副官,设副官i收到命令vi。 分为独立的n-1轮:对每个副官i,将其视为司令,使用协议A(n-1, m-1)将vi发送到所有其它副官。 这样每个副官都收到n-1条信息,每个副官都按照出现次数更多的命令行事(如果进攻和撤退的命令一样多,则默认取撤退)。 递归证明 引理:当n>2m+k,n个将军中至多k个叛徒,协议A(n, m)满足IC2,即司令是忠诚的,每个忠诚的副官将会执行司令的命令。 进而说明: 当n>3m时,n个将军,且至多m个叛徒,协议A(n, m)可以同时满足IC1和IC2。 更深刻的结论: 当n<=3m时,n个将军中的m个叛徒可以让将军们无法达成一致,也就是满足IC1和IC2的协议不可能存在。 参考: The Byzantine Generals Problem , the first paper involved 可信计算VII:拜占庭将军问题 Byzantine failure -- Wikipedia, the free encyclopedia