为什么我可以提高子类中重写方法的可见性,这不是安全风险吗?

Suj*_*dal 0 java inheritance

如果我们考虑这段代码,它是不是安全风险,如果是,那么为什么java允许它?

class SomeApi
{
    void someImportantInnerApiMethod()
    {
    //some operation
    } 
}

class MaliciousUserClass extends SomeApi
{
    @Override
    public void someImportantInnerApiMethod()
    {
        super.someImportantInnerApiMethod();
        //inner api method now exposed
    } 
}
Run Code Online (Sandbox Code Playgroud)

Ser*_*nov 6

访问修饰符不是为了安全.无论如何,您甚至可以通过反射调用私有方法.它们用于封装,可以防止编程错误,并在一定程度上实现良好的编程风格.

即使你不能公开覆盖方法,你仍然可以这样做:

class SomeApi
{
    void someImportantInnerApiMethod()
    {
    //some operation
    } 
}

class MaliciousUserClass extends SomeApi
{
    public void aMethodWithATotallyDifferentName()
    {
        // ... that still exposes that important inner API method!
        super.someImportantInnerApiMethod();
    } 
}
Run Code Online (Sandbox Code Playgroud)

由于您可以通过这种方式使其"可访问",因此Java所做的唯一事情就是允许您在保留方法名称的同时执行完全相同的操作,如果您真的想要这样做的话.没有伤害,因为你通常不会意外地做这种事情.

也许值得一提的是,包私有访问非常容易规避:与.Net不同internal,你可以将你的类放在与你正在使用的另一个库相同的包中,并且你可以自由地调用包私有方法. !比如说,你声明你的类是javax.swing包的一部分,现在它可以调用Swing的包私有方法.安全性太高了.你甚至不需要继承和/或反思.

  • 我不会说这是一个愚蠢的问题,虽然我从未认为这是一个问题,但我确实喜欢阅读谢尔盖的回应。另外,他们不是说没有愚蠢的问题吗? (2认同)