如果我们考虑这段代码,是不是存在安全风险,如果是,那么为什么java允许呢?
class SomeApi
{
void someImportantInnerApiMethod()
{
//some operation
}
}
class MaliciousUserClass extends SomeApi
{
@Override
public void someImportantInnerApiMethod()
{
super.someImportantInnerApiMethod();
//inner api method now exposed
}
}
答案 0 :(得分:6)
访问修饰符不是为了安全。无论如何,您甚至可以通过反射调用私有方法。它们用于封装,可以防止编程错误并在一定程度上强制执行良好的编程风格。
即使你不能公开覆盖方法,你仍然可以这样做:
class SomeApi
{
void someImportantInnerApiMethod()
{
//some operation
}
}
class MaliciousUserClass extends SomeApi
{
public void aMethodWithATotallyDifferentName()
{
// ... that still exposes that important inner API method!
super.someImportantInnerApiMethod();
}
}
由于您可以通过这种方式使其“可访问”,因此Java所做的唯一事情就是允许您在保留方法名称的同时执行完全相同的操作,如果您真的想这样做的话。没有伤害,因为你通常不会意外地做这种事情。
也许值得一提的是,包私有访问非常容易规避:与.Net的internal
不同,你可以把你的类放在与你正在使用的另一个库相同的包中,并且你'可以自由调用包私有方法!比如说,你声明你的类是javax.swing
包的一部分,现在它可以调用Swing的包私有方法。安全性太高了。你甚至不需要继承和/或反思。