在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文档 http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html澄清我的问题。
选择访问级别的提示:
如果其他程序员使用你的类,你要确保错误
误用不会发生。访问级别可以帮助您做到这一点。使用
对于特定的情况有意义的最严格的访问级别
成员。使用 private 除非你有充分的理由不这样做。
这取决于你所说的“安全”是什么意思。如果您运行的安全管理器允许这种事情,那么是的,您可以通过反射做各种讨厌的事情。但在这种环境下,库可能只需修改即可使该方法公开。
在这样的环境中,访问控制实际上是“咨询”——您实际上信任代码能够很好地发挥作用。如果你don't信任您正在运行的代码,您应该使用更具限制性的安全管理器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)