如何让某个函数仅供某些 类 访问?

How to make a function accessible to certain classes only?

我正在为一个软件开发 API,这样我的用户就可以在不修改源代码的情况下扩展它。但是,出于安全原因,我只希望某些 类 访问某些功能。有没有办法做到这一点?另外,我没有代码,因为我不知道该怎么做。

谢谢! -特伦特

要保护 classes 中的变量,您可以将它们设为 private,并通过 getter 和 setter 方法访问 levels of protection。这也适用于 classes 本身;如果你想阻止用户实例化 class,你可以将 class' 构造函数标记为 protected 以允许仅在其包内实例化。

如果您想完全隐藏 class 的实现细节,您可以将 class 声明为 class X 而不是 public class X,这将隐藏方法API 用于标准开发。

这会很快让您得到您想要的行为,但是 Java 的一个方面叫做 reflection, which allows an executable Java program to analyze and manipulate it's own implementation; in this regard, no field or method is ever completely safe

您还可以通过 'immutable' Objects 提供对变量的访问来保护变量;这些对象旨在禁止调用者修改原始源内容。

对此我有两个想法,一个是你可以看看 Minecraft Forge 如何创建他们的插件 API。

另一种方法是在您的核心代码和实际插件之间设置一个限制 API,但是,您需要注意平台。例如,如果您使用 Java 或 C# 编写核心应用程序,那么我可以使用 Aspect Oriented Programming (AOP) 来绕过您的安全并让我的代码改变您的行为。

如果您使用 functional programming (FP) 语言,那么您可以保护更多免受此类方法的影响,如果您也没有在这些平台上使用语言,但它们并不完美。

所以,在功能和便利性之间需要权衡取舍,那么您希望您的应用程序有多有用,以及有多安全?

一个可行的解决方案是,如果你使用类似于 Minecraft 的东西,虽然我怀疑他们这样做,但是,给用户一个存根应用程序。他们可以用插件对其进行扩展,他们可以修改的接口函数都在存根中。程序启动时会加载插件,可能会修改或扩展接口,然后将核心程序拉下来放入存根中,然后才是真正的程序运行。核心程序可以重新编译和操作,因此方法名称会更改,因此反射更难使用,但采用这种方法并做好它会很困难。

顺便说一句,我喜欢 Alex T 的回应,我只是对他的一些回应使用了不同的术语,例如 AOP 而不是反射,不变性是 FP 的一部分。

您提到了 jar,这意味着您正在使用在 JVM 上运行的东西,因此您可能需要阅读 AspectJ,因为它可以显着改变应用程序的行为。您可以拥有私有方法,但我可以放置代替您运行的代码,或者在调用方法之前或之后更改参数或 return 值。