我正在开发一个软件的 API,以便我的用户可以在不修改源代码的情况下扩展它。但是,出于安全原因,我希望某些类只访问某些函数。有办法做到这一点吗?
我对此有两个想法,一是你可以看看 Minecraft Forge 如何创建他们的插件 API。
另一种方法是在核心代码和实际插件之间使用有限的 API,但是,您需要小心平台。例如,如果您用 Java 或 C# 编写核心应用程序,那么我可以使用面向方面编程(AOP)来绕过您的安全性并让我的代码改变您的行为。
如果您使用函数式编程(FP)语言,那么您可以保护更多免受此类方法的侵害,如果您也没有在这些平台上使用语言,但它们并不完美。
因此,在功能和便利性之间需要权衡,那么您希望您的应用程序有多有用以及有多安全?
一个可能有效的解决方案是,如果您使用类似于 Minecraft 的东西,尽管我怀疑他们会这样做,但是,为用户提供一个存根应用程序。他们可以用插件来扩展它,他们可以修改的接口函数都在存根中。当程序启动时,会加载插件,并且可能会修改或扩展接口,但是,然后将核心程序拉下来并放入存根中,然后运行实际的程序。核心程序可以重新编译和操作,因此方法名称会改变,因此反射更难使用,但采用这种方法并做好它会很困难。
顺便说一句,我喜欢 Alex T 的回应,我只是对他的一些术语给出了不同的术语,例如 AOP 而不是反射,不变性是 FP 的一部分。
您提到了 jar,这意味着您正在使用在 JVM 上运行的东西,因此您可能需要阅读 AspectJ,因为它可以显着改变应用程序的行为。您可以拥有私有方法,但我可以放置代替您运行的代码,或者在调用该方法之前或之后更改参数或返回值。
要保护类内部的变量,您可以将它们设置为
private
,并可通过具有不同保护级别的 getter 和 setter 方法进行访问。这也适用于类本身;如果你想阻止用户实例化一个类,你可以将类的构造函数标记为 protected
以允许仅在其包内实例化。
如果您想完全隐藏类的实现细节,您可以将该类声明为
class X
而不是 public class X
,这会隐藏标准开发 API 中的方法。
这将很快让你得到你想要的行为,但是 Java 有一个叫做 reflection 的方面,它允许可执行的 Java 程序分析和操作它自己的实现;在这方面,没有任何领域或方法是完全安全的。
您还可以通过“不可变”对象提供对变量的访问来保护变量;这些对象旨在禁止调用者修改原始源内容。