父类转为子类涉及到的安全问题

HTTPServletrequest  req = (HTTPServletrequest  )new ServletRequest();

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  HttpServletRequest req = (HttpServletRequest) request;
  HttpServletResponse resp = (HttpServletResponse) response;

}

因为要用到HttpServletRequest中的方法,我对ServletRequest进行了强转,然后问题解决。可是后来一想不对啊,我们知道我们对子类实现进行向上转型得到父类对象是安全的,因为子类会完全继承父类的方法,我们向上转型为父类,当我们调用父类的方法其实在子类实现中是能完全找到的。反之向下转型是不安全的,我们子类除了完全继承父类的方法外还会拓展自己的方法,所以我们在调用子类方法时可能在父类实现中是找不到的,所以向下转型不安全。

可是本例中的实现却让我们困惑,我们不仅实现了向下转型,同时还调用了子类拓展的方法,是父类没有的,可是却实现了。这不是和我们所学矛盾吗?后来看了API和一些资料我终于明白了,这和我们所学其实并不冲突!我们先看API:

public interface HttpServletRequest extends ServletRequest

终于找到原因了,原来HttpServletRequest和ServletRequest都是接口,他们都只是定义了方法却没有提供相关实现。所以我们看到的ServletRequest request中的request对象其实并不是我们ServletRequest 的一个具体实现。

这里我们要看我们提出的问题是否安全,其实主要看request 对象的具体实现类究竟是继承的哪个接口,如果继承自HttpServletRequest接口那么我们向下转型使用HttpServletRequest接口的方法就是安全的。测试如下:

if(request instanceof HttpServletRequest){
        System.out.println("我是右边类的实例");
    }

输出:我是右边类的实例,证明我们的request对象的确是HttpServletRequest的一个实例。

疑问解决。

时间: 2024-12-17 02:37:51

父类转为子类涉及到的安全问题的相关文章

多态&&父类调用子类特有的方法

/* 多态 1.没有继承就没有多态 2.代码的体现:父类类型的指针指向子类对象 3.好处:如果函数\方法参数使用的是父类对象,可以传入父类.子类对象 4.局限性: 1>父类类型的变量,不能直接调用子类特有的方法,必须强转为子类类型变量后,才能直接调用子类特有的方法 Animal *aa = [Cat new]; // Animal是父类 Cat是子类 Cat *dd = (Cat *)aa;  // 强制转换为子类 [dd run]; // run是子类Cat特有的方法 */

谈谈父类和子类的隔离性

以前写代码知道要给类外设置访问接口, 例如下例: 1 class Money 2 { 3 public: 4 Money(int money) : m_curValue(money){} 5 6 void store(int money) { m_curValue += money;} 7 void spent(int money){ m_curValue -= money;} 8 private: 9 int m_curValue; 10 }; 11 12 int main(int argc,

【C/C++学院】0823-静态联合编译与动态联合编译/父类指针子类指针释放/虚函数/纯虚函数概念以及虚析构函数/抽象类与纯虚函数以及应用/虚函数原理/虚函数分层以及异质链表/类模板的概念以及应用

静态联合编译与动态联合编译 #include <iostream> #include <stdlib.h> //散列 void go(int num) { } void go(char *str) { } //class //::在一个类中 class A { public: void go(int num) { } void go(char *str) { } }; void main() { ///auto p = go;编译的阶段,静态联编 void(*p1)(char *s

java基础入门-父类引用子类对象(2)-抽象类

抽象类:具有抽象方法的类,需要使用abstract关键字修饰 关系图 下面上代码 package com.ray.testobject; /** * 抽象类 * * @author ray * @since 2015-05-02 * @version 1.0 * */ public abstract class Person { public abstract void getDescription(); } package com.ray.testobject; /** * 实现类 * * @

override(重写,覆盖) 1、方法名、参数、返回值相同。 2、子类方法不能缩小父类方法的访问权限。 3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。 4、存在于父类和子类之间。 5、方法被定义为final不能被重写。 overload(重载,过载) 1、参数类型、个数、顺序至少有一个不相同。 2、不能重载只有返回值不同的方法名。 3、存在于父类和子

override(重写,覆盖) 1.方法名.参数.返回值相同. 2.子类方法不能缩小父类方法的访问权限. 3.子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常). 4.存在于父类和子类之间. 5.方法被定义为final不能被重写. overload(重载,过载) 1.参数类型.个数.顺序至少有一个不相同.   2.不能重载只有返回值不同的方法名. 3.存在于父类和子类.同类中. 方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现. 重写(O

如何给父类和子类赋值

今天遇到了一个问题,就是如何给父类下的子类赋值.一直没解决,后来是通过别人的帮助解决的.我先把代码贴出来看看吧! 第一张图是一个两个类,一个父类和一个子类.第二张图是把两个类合并起来后的一个类.因为项目需要添加的,可以忽略. 第一步,要实例化父类,然后再实例化子类. mo.Hospital = new List<HospitalForCastle>();这是关键的一步,就是实例化子类,注意一下,实例化的时候,它是一个list集合了,然后再把结果集赋值给它.赋值的时候注意需要实例化子类,这时候实

父类到子类的转换和instance of运算符

父类到子类的转换和instanceof运算符 主讲教师:王少华 QQ群号:483773664 学习目标: 1)   父类与子类转换:向下转换 2)   掌握instanceof运算符的使用 一.  问题:实现主人与宠物的玩耍功能 (一)   需求: 和狗玩接飞船游戏,狗的健康值减少10,与主人亲密度增加5 和企鹅玩游泳游戏,企鹅的健康值减少10,与主人亲密度增加5 (二)   实现思路 1)   给Dog类添加catchingFlyDisc方法,实现接飞盘功能: 2)   给Penguin类添加

final,static静态和非静态,初始化和代码块的区别、父类和子类中都有static变量时的初始化顺序、重写equals()、 instanceof强制转换

final:类不能被继承,方法不能被重写,属性值不能被修改(常量): 可以调用: static静态常量----- 不需要创建对象,可以直接调用类里面的属性,方法: 示例如下: 加了static说明它是属于整个类的,每个对象值都一样,如下图所示:size是静态的,所以当在下面t1对象中改变size的值时,整个类中的size值都变了:然后作为普通属性的length,当在t1对象中改变其值,并不会改变原始值: 静态方法不能调用非静态的方法和非静态的属性,也不能打印非静态的方法和非静态的属性:可以在静态

父类和子类可以相互转化吗?

理论上说你可以在任何类型中转换,前题是你自己必须清楚你自己在做什么,准确一点说是知道编译器将会怎么做.父类和子类可以视做两个不同的数据类型,所以没有什么可以阻碍你强制转化的.从子类到父类,是由大变小,所以无妨;而从父类到子类,是从小变大,有的东西就不存在了,所以你自己必须清楚,基于这原则,编译器往往设定一些方法来警告你甚至阻止你. 从弗雷转到子类时,子类中的成员变量为0 p,li { white-space: pre-wrap } class Base { public: Base() {cat