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

标签 java inheritance

如果我们考虑这段代码,是否存在安全风险?如果是,那么为什么 java 允许这样做?

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

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

最佳答案

访问修饰符并不意味着安全。无论如何,您甚至可以通过反射调用私有(private)方法。它们旨在进行封装,以防止编程错误并在一定程度上强化良好的编程风格。

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

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

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

既然你可以通过这种方式使其“可访问”,那么Java所做的唯一一件事就是允许你在保留方法名称的同时做完全相同的事情,如果你真的想这样做的话。不会造成任何伤害,因为您通常不会意外地做这种事情。

还值得一提的是,包私有(private)访问非常容易被规避:与.Net的内部不同,您确实可以将您的类与您正在使用的另一个库放在同一个包中,并且您可以自由调用包私有(private)方法!假设您将类声明为 javax.swing 包的一部分,现在它可以调用 Swing 的包私有(private)方法。安全就这么多了。您甚至不需要继承和/或反射。

关于java - 为什么我可以增加子类中重写方法的可见性,这不是安全风险吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39024043/

相关文章:

c++ - 我如何访问继承代码的不同部分

ios - 无法将条形按钮链接到父类(super class)中的@IBAction

entity-framework - Entity Framework 、继承和命名空间

Java - 非泛型类扩展泛型类

java - 邮件 API - SSL 消息 - 如何正确设置发件人电子邮件

java - 切换程序失败

java - 在创建 JFrame 之前打开 MIDI Synth 会导致 JVM 挂起

c++ - 为什么使用声明不能解决菱形继承(钻石问题)?

Java从数据库中获取Blob并写入

java - 将属性从 PropertyPlaceholderConfigurer 加载到系统属性