簡體   English   中英

為什么我可以提高子類中重寫方法的可見性,這不是安全隱患嗎?

[英]Why can i increase the visibility of a overridden method in a subclass, is it not a security risk?

如果我們考慮這段代碼,那不是安全隱患嗎?如果是,那么為什么Java允許呢?

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

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

訪問修飾符並不旨在保證安全。 無論如何,您甚至可以通過反射來調用私有方法。 它們用於封裝,可以避免編程錯誤,並在一定程度上增強良好的編程風格。

即使您不能公開重寫的方法,您仍然可以這樣做:

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的package-private方法。 安全性非常重要。 您甚至不需要繼承和/或反思。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM