在Java中,private访问修饰符被认为是安全的,因为它在类外部不可见。然后外面的世界也不知道这种方法。
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反射做这种事情?
method[]
我引用Java文档中的一些观点来澄清我的问题。
选择访问级别的提示: 如果其他程序员使用您的类,则要确保不会发生由于滥用而引起的错误。访问级别可以帮助您做到这一点。使用对特定成员有意义的限制性最高的访问级别。除非有充分的理由,否则请使用private。
选择访问级别的提示:
如果其他程序员使用您的类,则要确保不会发生由于滥用而引起的错误。访问级别可以帮助您做到这一点。使用对特定成员有意义的限制性最高的访问级别。除非有充分的理由,否则请使用private。
这取决于您所说的“安全”。如果您正在与允许这种事情的安全管理器一起运行,那么可以,您可以通过反射来做各种令人讨厌的事情。但是,在这种环境下,无论如何都可以修改该库以使该方法公开。
在这样的环境中,访问控制实际上是“建议”-您实际上信任代码可以很好地播放。如果您 不 信任正在运行的代码,则应使用限制性更强的安全管理器。