当前位置: 首页 > 面试题库 >

私有方法真的安全吗?

华子昂
2023-03-14
问题内容

在Java中,private访问修饰符被认为是安全的,因为它在类外部不可见。然后外面的世界也不知道这种方法。

但是我认为Java反射可以用来打破这一规则。考虑以下情况:

public class ProtectedPrivacy{

  private String getInfo(){
     return "confidential"; 
  }

}

现在从另一堂课我将获得信息:

public class BreakPrivacy{

   public static void main(String[] args) throws Exception {
       ProtectedPrivacy protectedPrivacy = new ProtectedPrivacy();
       Method method = protectedPrivacy.getClass().getDeclaredMethod("getInfo", null);
       method.setAccessible(true);
       Object result = method.invoke(protectedPrivacy);
       System.out.println(result.toString());
   }
}

这时我只是觉得私有方法仍然安全,因为要做上面的事情我们必须知道方法名称。但是,如果类包含由其他人编写的私有方法,那么我们将看不到那些。

但是,由于下面的代码行,我的观点变得无效。

Method method[] = new ProtectedPrivacy().getClass().getDeclaredMethods();

现在,它method[]包含了需要做的所有事情。我的问题是,有没有一种方法可以避免使用Java反射做这种事情?

我引用Java文档中的一些观点来澄清我的问题。

选择访问级别的提示:

如果其他程序员使用您的类,则要确保不会发生由于滥用而引起的错误。访问级别可以帮助您做到这一点。使用对特定成员有意义的限制性最高的访问级别。除非有充分的理由,否则请使用private。


问题答案:

这取决于您所说的“安全”。如果您正在与允许这种事情的安全管理器一起运行,那么可以,您可以通过反射来做各种令人讨厌的事情。但是,在这种环境下,无论如何都可以修改该库以使该方法公开。

在这样的环境中,访问控制实际上是“建议”-您实际上信任代码可以很好地播放。如果您 信任正在运行的代码,则应使用限制性更强的安全管理器。



 类似资料:
  • 问题内容: 我正在寻找一个“安全”的评估函数,以实现类似于电子表格的计算(使用numpy / scipy)。 由于明显的不可修复的安全性问题,自2.3起,已从Python中删除了执行此功能的功能(rexec模块)。有一些第三方黑客声称可以做到这一点- 我发现的最周到的解决方案是 此Python Cookbok食谱 “ safe_eval”。 如果使用此命令(或类似方法)来保护自己免受恶意代码的侵害

  • 我问了几个问题试图解决这个简单的问题,但似乎没有任何效果。 有私人/公共帖子的推荐方式是什么?我想有一个网站,如果作者/编辑/管理员登录在每个私人帖子和公共帖子是可见/搜索。如果用户未登录,则仅可查看公共帖子。 我想过/尝试过许多方法来做这件事。一个简单的方法,我实现了这种方式,使用WP_Query包括/排除登录/退出时具有自定义字段“私人”的所有帖子。 虽然这工作得很好,但我有两个问题,它的安全

  • 问题内容: 要使用公共方法创建JavaScript类,我需要执行以下操作: 这样,我班的用户可以: 如何创建一个私有方法,该私有方法可以由和方法调用,但不能由该类的用户外部调用? 换句话说,我希望我的方法实现能够做到: 但这不起作用: 如何将其定义为私有方法,使两者都适用? 我已经读过Doug Crockford的文章 几次,但似乎公共方法不能调用“私有”方法,而外部可以调用“特权”方法。 问题答

  • 我试图模仿一个私有方法,如下所示。但是,在第4行,JUnit正在调用相关的validateLanguage方法,并且由于私有方法validateLanguage在调用其他方法时引发了异常,因此没有返回模拟值。我的理解是,使用PowerMock的JUnit应该跳过validateLanguage实际实现的调用。有人能澄清一下吗?

  • 我试图模拟一个私有方法(executeGetRequest),在我声明要为私有方法返回的模拟的那一行中,私有方法实际上是用null参数执行的,因此抛出了一个NullPointerException。 VlcPlayerMinimal。爪哇: VlcPlayerMinimalTest。爪哇: 堆栈跟踪: 它似乎PowerMockito实际上是调用的方法,我试图在行PowerMockito.do返回(

  • 问题内容: 我在这里谈论基本用法: 谷歌搜索以上问题,说是,但不是 -接受的答案是,是,但后续行动是否;Spring.io表示是和否,并且似乎是Java EE专家的Adam Bien给出了不合格的yes。 我对一个简单的调度bean的经验表明答案是否定的: 抽象界面: 开始于: 如果我打印出,即使我在两次调用之间仍在同一线程上,也会得到: 严重:java.lang.IllegalStateExce