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