如何使某个函数只能被某些类访问?

问题描述 投票:0回答:2

我正在开发一个软件的 API,以便我的用户可以在不修改源代码的情况下扩展它。但是,出于安全原因,我希望某些类只访问某些函数。有办法做到这一点吗?

java security
2个回答
2
投票

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

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

如果您使用函数式编程(FP)语言,那么您可以保护更多免受此类方法的侵害,如果您也没有在这些平台上使用语言,但它们并不完美。

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

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

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

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


1
投票

要保护类内部的变量,您可以将它们设置为

private
,并可通过具有不同保护级别的 getter 和 setter 方法进行访问。这也适用于类本身;如果你想阻止用户实例化一个类,你可以将类的构造函数标记为
protected
以允许仅在其包内实例化。

如果您想完全隐藏类的实现细节,您可以将该类声明为

class X
而不是
public class X
,这会隐藏标准开发 API 中的方法。

这将很快让你得到你想要的行为,但是 Java 有一个叫做 reflection 的方面,它允许可执行的 Java 程序分析和操作它自己的实现;在这方面,没有任何领域或方法是完全安全的。

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

© www.soinside.com 2019 - 2024. All rights reserved.