是否有一种语言具有可以阻止类访问任何其他类的功能,除非包含实例或引用?
isolated class Example {
public Integer i;
public void doSomething()
{
i = 5; // This is ok because i belongs to this class
/*
* This is forbidden because this class can only
* access anything contained within, nothing outside
*/
System.out.println("This does not work.");
}
}
[edit]示例用例可能是插件系统。我可以定义一个插件对象,引用类可以操作的某些对象,但不允许任何其他对象。它可能会使安全问题变得更加容易。[/ edit]
答案 0 :(得分:1)
任何必须包含标题的语言都可能会计算:只是不要包含任何标题。
但是,我敢打赌,没有明确禁止外部访问的语言。重点是什么?如果您无法访问外部世界,您将无法做任何事情。而且,为什么Integer
的引用可以正常,但System.out.println
不是?
如果您澄清潜在的用例,我们可能会帮助您更好......
编辑您的编辑:
我以为你可能会去那里。
如果这是为了安全起见,那从一开始就存在缺陷。我们来看看:
class EvilCode {
void DoNiceThings() {
HardDrive.Format();
}
}
我有什么动力自愿在课堂上放置关键词?我当然不会去,因为我很好,因为我不是!
要考虑的一件事是,无论何时加载不属于您自己的本机代码(原生代,在这种情况下,意味着没有编写脚本),您可能会允许坏人运行他的代码。没有任何语言功能可以保护您。
正确答案取决于您的目标语言。 Java具有安全描述符,.NET允许您创建具有受限权限的AppDomain等。不幸的是,我不是这些领域的专家。
答案 1 :(得分:1)
我不知道任何具有此类意图的基于类的访问修饰符,但我认为访问修饰符无论如何都是错误的。
基于功能的安全性,或者更具体地说,对象能力模型似乎就是您想要的。
http://en.wikipedia.org/wiki/Object-capability_model
基本思想是,为了对对象做任何事情,你需要保持对它的引用。扣留参考资料,无法访问。
全局事物(例如System.out.println)和其他一些事情是语言的问题特征,因为任何人都可以在没有参考的情况下访问它们。
诸如E之类的语言或google caja(用于Javascript)等工具允许使用适当的对象功能模型。这是JS中的一个例子:
function Example(someObj) {
this.someObj = someObj;
this.doStuff() = function() {
this.someObj.foo(); //allowed, we have been given a reference to it
alert("foobar"); //caja may deny/proxy access to global "alert"
}
}