Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我可以在子类中增加重写方法的可见性,这不是安全风险吗? 如果我们考虑这段代码,它不是安全风险吗?如果是,那么java为什么允许?< /P> class SomeApi { void someImportantInnerApiMethod() { //some operation } } class MaliciousUserClass extends SomeApi { @Override public void someImportantInnerApiMethod() { super.someImportantInnerApiMethod(); //inner api method now exposed } }_Java_Inheritance - Fatal编程技术网

为什么我可以在子类中增加重写方法的可见性,这不是安全风险吗? 如果我们考虑这段代码,它不是安全风险吗?如果是,那么java为什么允许?< /P> class SomeApi { void someImportantInnerApiMethod() { //some operation } } class MaliciousUserClass extends SomeApi { @Override public void someImportantInnerApiMethod() { super.someImportantInnerApiMethod(); //inner api method now exposed } }

为什么我可以在子类中增加重写方法的可见性,这不是安全风险吗? 如果我们考虑这段代码,它不是安全风险吗?如果是,那么java为什么允许?< /P> class SomeApi { void someImportantInnerApiMethod() { //some operation } } class MaliciousUserClass extends SomeApi { @Override public void someImportantInnerApiMethod() { super.someImportantInnerApiMethod(); //inner api method now exposed } },java,inheritance,Java,Inheritance,访问修饰符不是为了安全。您甚至可以通过反射调用私有方法。它们用于封装,以防止编程错误,并在一定程度上加强良好的编程风格 即使无法将重写的方法公开,也可以这样做: class SomeApi { void someImportantInnerApiMethod() { //some operation } } class MaliciousUserClass extends SomeApi { public void aMethodWithATotall

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

即使无法将重写的方法公开,也可以这样做:

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的
内部
不同,您可以将类与正在使用的另一个库放在同一个包中,并且您可以自由调用包私有方法!比方说,您将类声明为
javax.swing
包的一部分,现在它可以调用swing的包私有方法。安全问题到此为止。您甚至不需要继承和/或反射。

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

即使无法将重写的方法公开,也可以这样做:

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的
内部
不同,您可以将类与正在使用的另一个库放在同一个包中,并且您可以自由调用包私有方法!比方说,您将类声明为
javax.swing
包的一部分,现在它可以调用swing的包私有方法。安全问题到此为止。您甚至不需要继承和/或反射。

可见性与安全无关。“为什么”的问题过于宽泛,请参阅Eric Lippert在上的答案,我认为这里的答案是,因为它不会伤害任何东西;如果你想确定一个方法,你可以将其定为最终方法。@DonBranson假设我有一个api&其中一些类类似于上面的类“SomeApi”&用户决定扩展并显示所有内部受保护/默认方法,那么这不是一个安全问题吗?如果限制可见性提供了任何安全性,但它提供了绝对零安全性。可见性与安全性无关。“为什么”问题过于宽泛,请参阅Eric Lippert在上一篇文章中的答案,我认为这里的答案是,因为它不会伤害任何东西;如果你想确定一个方法,你可以将其定为最终方法。@DonBranson假设我有一个api&其中一些类类似于上面的类“SomeApi”&用户决定扩展并显示所有内部受保护/默认方法,那么这不是一个安全问题吗?如果限制可见性提供了任何安全性,但它提供绝对零安全性。我意识到这是有史以来问过的最愚蠢的问题!谢谢你这么清楚地指出这一点。我不会说这是一个愚蠢的问题,虽然我从来没有想过这是一个问题,但我确实喜欢阅读谢尔盖的回答。另外,他们不是说没有愚蠢的问题吗?我意识到这是有史以来问过的最愚蠢的问题!谢谢你这么清楚地指出这一点。我不会说这是一个愚蠢的问题,虽然我从来没有想过这是一个问题,但我确实喜欢阅读谢尔盖的回答。另外,他们不是说没有愚蠢的问题吗。