Java Difference软件包中的两个类如何隔离它们?

Java Difference软件包中的两个类如何隔离它们?,java,class,packages,names,Java,Class,Packages,Names,我们必须开发一个游戏,用户可以上传他们的代码,例如石头剪纸。他们必须从接口类实现一些方法,我们在游戏类中调用它们,没有什么特别的 用户的代码在包中,我们没有名称冲突, 但对于主要主题:我们如何确保用户A不调用用户B类中的方法?请看一看如果您在程序中包含并运行其他人的代码,没有任何东西阻止他们调用您的方法 您可以将您的方法包私有化并密封包,等等,但是您仍然需要处理反射等问题 如果我在哪里,我会考虑通过一个明确的网络协议或通过标准的输入/输出来与用户代码接口。 < P>一种方式是将这两个类加载到不同

我们必须开发一个游戏,用户可以上传他们的代码,例如石头剪纸。他们必须从接口类实现一些方法,我们在游戏类中调用它们,没有什么特别的

用户的代码在包中,我们没有名称冲突,

但对于主要主题:我们如何确保用户A不调用用户B类中的方法?

请看一看

如果您在程序中包含并运行其他人的代码,没有任何东西阻止他们调用您的方法

您可以将您的方法包私有化并密封包,等等,但是您仍然需要处理反射等问题


如果我在哪里,我会考虑通过一个明确的网络协议或通过标准的输入/输出来与用户代码接口。

< P>一种方式是将这两个类加载到不同的类加载器中。为了完全安全,您还需要在安全沙箱中运行类,以停止反射和其他可能绕过类装入器障碍的机制


事实上,我认为这可能有一个缺陷。如果两个“player”类实现相同的接口,那么它们可以多病态地调用共享接口中定义的方法。它们被加载到不同的类加载器中,因此不能使用彼此的类型,这一事实并不能阻止这一点


因此,您基本上依赖于阻塞反射(以及良好的编程)来防止一个类/对象挖出另一个的实例。阻塞反射还可以防止一个类破坏另一个类的封装,或者调用未在公共超类或共享接口中定义的方法。

一种简单的方法可以确保所有方法都受到
保护
默认值
,以便包外的任何人都无法访问它们。

这些都是猜测,但请注意:

  • 安全经理
  • 检查字节码是否存在非法操作(例如,使用ASM)
  • 每个游戏都有一个单独的类加载器

或者,您可以让用户上传脚本,而不是真正的Java代码,例如可以使用Rhino运行的ECMAScript。

您不能,只要这些是公共方法,除非您在不同的类装入器中隔离,在这种情况下,每个类都无法看到彼此

如何在不同的类加载器中加载web容器,如Tomcat、Jetty等。。隔离不同的web应用程序


另一种方法可以是设置自定义安全实现,但要使其正确运行要比类加载器解决方案困难得多。

我相信通过安全管理器可以保护私有方法不受反射的影响,但我在这方面没有任何经验。这当然有助于防止名称冲突,但我不认为这会阻止游戏之间的交叉交流(如果一个游戏可以通过某种方式控制另一个游戏),我认为OSGi就是这样做的-如果你对捆绑包的理解有误,你会发现很多NoClassDefFound错误。@Bart van Heukelom-你是对的。更新了我的答案来解决这个问题。但是我需要访问这些方法,因为我的游戏主类从用户那里调用这些类。我用安全管理器启动整个程序,所以他们没有文件访问权限。。。