我来自 C/C++ 背景,现在做了很多 C# 的工作。
最近我开始对用 Java 做一些项目感兴趣,因为我在玩 Android SDK。
我知道 Java 应用程序在沙箱中运行,可以限制它们对系统的访问。
在桌面/服务器应用程序环境中,有哪些限制?
我来自 C/C++ 背景,现在做了很多 C# 的工作。
最近我开始对用 Java 做一些项目感兴趣,因为我在玩 Android SDK。
我知道 Java 应用程序在沙箱中运行,可以限制它们对系统的访问。
在桌面/服务器应用程序环境中,有哪些限制?
Java 应用程序在沙盒中很像 .NET 应用程序在沙盒中。它们都在各自的虚拟机上运行,并且对于它们的功能确实有一些限制,但在大多数情况下,它们对系统有很多访问权限,包括通过某些调用访问本机代码。
您可能正在考虑Java 小程序,它在浏览器中运行,通常位于安全沙箱中,可防止访问本地文件等系统资源。(可以通过专门授予某些小程序对系统的访问权限来规避此限制。)
这是The Java Tutorials中关于小程序安全限制的部分,其中包括对小程序的限制列表。
通常桌面和服务器应用程序在禁用安全性的情况下运行。但是,Java 和 JVM 仍然有一个健壮的类型系统,因此您不能例如强制转换为不是创建对象时使用的类型,不能访问已释放的内存,也不能在缓冲区末尾运行。
对于普通的桌面和服务器应用程序,这些限制与沙盒概念无关(尽管您可以使用它对例如用户提交的代码应用非常细粒度的限制),而是与 Java 的平台无关性有关。基本上,操作系统特定的东西和硬件访问通常不能在纯 JAVA 中完成,除非 API 库特别处理。
例子是:
我认为您可能会看到的主要限制是,如果您需要,可以轻松使用本机系统 API,例如,如果您需要使用 java 中的 user32 或 kernel32 API,我认为这是可能的,但这不是一件容易的事要做,但是在 C# 中这是相当容易的事情。
此外,如果您有一些遗留的 C/C++ dll,您仍然可以在 C# 应用程序中使用它们,而在 java 中仍然很难做到,尤其是在最坏的情况下,当您的本机代码 api 必须使用指针时,您可以在C# 应用程序传递指针并在堆栈上分配固定内存......等。
但如上所述,Java 和 C# 通常具有相同的限制,特别是如果您的目标是独立于平台。