Java 如何使函数仅对某些类可访问?

Java 如何使函数仅对某些类可访问?,java,api,security,Java,Api,Security,我正在为一个软件开发一个API,这样我的用户就可以在不修改源代码的情况下扩展它。但是,出于安全原因,我只希望某些类访问某些函数。有什么办法可以这样做吗?此外,我没有代码,因为我不知道如何做到这一点 谢谢-Trent为了保护类内部的变量,您可以将它们设置为私有的,并通过getter和setter方法以不同的方式访问它们。这也适用于阶级本身;如果您想阻止用户实例化一个类,可以将该类的构造函数标记为受保护,以便只允许在其包中实例化 如果希望完全隐藏类的实现细节,可以将该类声明为classx,而不是pu

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


谢谢-Trent

为了保护类内部的变量,您可以将它们设置为私有的,并通过getter和setter方法以不同的方式访问它们。这也适用于阶级本身;如果您想阻止用户实例化一个类,可以将该类的构造函数标记为
受保护
,以便只允许在其包中实例化

如果希望完全隐藏类的实现细节,可以将该类声明为
classx
,而不是
publicclassx
,这将在标准开发的API中隐藏方法

这将很快让您了解您所追求的行为,但是Java有一个方面叫做,它允许可执行Java程序分析和操作自己的实现;在这方面


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

为了保护类内部的变量,可以将它们设置为私有的,并通过getter和setter方法以不同的方式访问它们。这也适用于阶级本身;如果您想阻止用户实例化一个类,可以将该类的构造函数标记为
受保护
,以便只允许在其包中实例化

如果希望完全隐藏类的实现细节,可以将该类声明为
classx
,而不是
publicclassx
,这将在标准开发的API中隐藏方法

这将很快让您了解您所追求的行为,但是Java有一个方面叫做,它允许可执行Java程序分析和操作自己的实现;在这方面


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

为了保护类内部的变量,可以将它们设置为私有的,并通过getter和setter方法以不同的方式访问它们。这也适用于阶级本身;如果您想阻止用户实例化一个类,可以将该类的构造函数标记为
受保护
,以便只允许在其包中实例化

如果希望完全隐藏类的实现细节,可以将该类声明为
classx
,而不是
publicclassx
,这将在标准开发的API中隐藏方法

这将很快让您了解您所追求的行为,但是Java有一个方面叫做,它允许可执行Java程序分析和操作自己的实现;在这方面


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

为了保护类内部的变量,可以将它们设置为私有的,并通过getter和setter方法以不同的方式访问它们。这也适用于阶级本身;如果您想阻止用户实例化一个类,可以将该类的构造函数标记为
受保护
,以便只允许在其包中实例化

如果希望完全隐藏类的实现细节,可以将该类声明为
classx
,而不是
publicclassx
,这将在标准开发的API中隐藏方法

这将很快让您了解您所追求的行为,但是Java有一个方面叫做,它允许可执行Java程序分析和操作自己的实现;在这方面


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

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

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

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

因此,在功能和方便性之间需要权衡,所以您希望您的应用程序有多有用,安全性有多高

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

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

您提到了jar,这意味着您正在使用在JVM上运行的东西,因此您可能需要仔细阅读,因为它可以显著地改变应用程序的行为。你可以使用私有方法,但我可以