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