在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