2011-09-28 67 views
3

的MDN JavaScript的指南指出了做Java和JavaScript之间的比较时,以下几点:Java和类型安全

类型的安全手段,例如,你不能施放一个Java整数到一个对象引用或通过破坏Java字节码来访问私有内存。

当然,关于上述声明的第一部分,讲的打字类型安全的一般概念,当周围的语言能力,以提供某种检查的,消除了有关与不兼容的类型执行的操作可能的错误条件行健(即使上面的例子是幼稚的,考虑到在Java中你可以将原始的int加框到引用类型Integer)。

但是,他们在声明的第二部分究竟意味着什么?

Here有关于JVM的验证程序的讨论确保了内存保护级别 - 其中“任意位模式不能用作地址。”

MDN声明的第二部分如何与类型安全相关?

+0

* int为引用类型Integer *,这只是编译器的“魔术”。内部(字节码,jni)类型根本不兼容。 – bestsss

回答

3

这意味着在Java中,(原则上)没有办法解决如何识别类型。在javascript中,可以根据表示一段数据的字节序列来推断类型。在Java中,VM禁止这种事情,以确保意图成为Foo对象的字节序列不能被视为Bar对象。

关于访问私有成员,这意味着您无法创建字节序列意味着与程序员预期的不同,以获得对意外事件的访问。在运行时,您不能将类型Foo的对象foo与私有成员foobar一起转换为类型为Bar的对象,其成员相同,但foobar已公开。 每个对象的类型都以字节代码编码,该代码由VM在运行时控制。

4

我怀疑他们的意思是,你不能施放任意内存地址转换成不同的类型,比如你可以在C.

struct bar_s { 
    char foo_s[100]; 
} 

void stuff() { 
    int foo = 5; 
    bar_s *bar = &foo; 
} 

原谅我,如果语法是错误的,我的C生锈。这需要foo的内存地址,将其指定给bar_s结构的指针,然后您可以解除引用大量相关的痛苦。你正在处理一个原本是int的内存区域。

在C中,有许多攻击媒介可以让你用任意信息覆盖内存,并且随后执行它们。请参见Buffer Overflow

在java中,一旦是Integer,总是一个Integer [*]。在所有数组上也有边界检查,这有助于防止缓冲区溢出。

[*]直到垃圾收集。