在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)是默认的访问级别,除非您有足够好的理由不采用它。
getDeclaredMethods
将返回看起来像垃圾的名称。 - Sergey Kalinichenko