有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

序列化Java继承问题:超越vtable

下面是一个场景:我有一个接口A,100个类B0。。。只执行A和50类C0、C2的B99。。。扩展B0,B2的C98。。。B98

B类使用MySQL数据库,在表上执行各种操作。 C类向B类添加额外的逻辑(验证、特权等)。 B类由工具生成,而C类由编码器编写

客户端应用程序将使用B类,而无权访问C类。当为B对象调用方法时,客户机将序列化该对象并将其与要调用的方法名一起发送到服务器应用程序

服务器将接收B对象并将其强制转换为A。但是,如果存在C类中重写的方法,则服务器希望执行该方法,否则执行B中重写的方法。正常行为只会执行B中的方法

如果没有一个巨大的SWITCH语句将接收到的对象强制转换为C,服务器怎么能做到这一点呢

编辑:我是java新手,不知道反射可以做什么。在谷歌(thisthis)的帮助下,我解决了我的问题。我可以使用动态铸造来实现我想要实现的目标。谢谢大家


共 (3) 个答案

  1. # 1 楼答案

    你有一个运行时类型为B的对象,你要求调用它,就好像它是一个类型为C的对象一样;除非最初创建为C,否则不能向下转换为C,因为一般来说,它没有C的所有字段

    我猜你的C类没有向B添加任何额外的字段(如果他们添加了,你的问题就没有意义了)。因为它们没有添加任何额外的字段,所以我可以看出将它们作为C来处理是有意义的,但是没有真正好的方法。我想说:

    1. 为什么首先会有Bs和Cs?为什么不让B类拥有所有的特权等等,然后使用它呢
    2. 如果做不到这一点,我想你可以使用反射。编写一些通用代码,获取任何B类对象,构造一个新的对应C对象,并复制所有字段
  2. # 2 楼答案

    假设每个C类都有一个构造函数或一个静态createFromSuper来从其父级B(或从a)创建它

    您可以创建一个FactoryClass,在其中注册所有可用的C。您可以使用反射来获取要“替换”的C的父级,记住每个B类->;C.映射/哈希表中的类映射

    然后,当您收到一个B时,将其传递给工厂,如果工厂找到映射,它将返回相同的B对象,或者调用构造函数/createFromSuper返回C

  3. # 3 楼答案

    这种方法听起来真的很奇怪。为什么不提供命令(例如定义命令名的字符串)并为这些命令注册命令对象?然后您只需发送命令以及一些序列化参数

    编辑:

    从您的描述来看,似乎C对象实际上是B对象的装饰器。在这种情况下,它们不会从相应的B继承,而是对其进行e引用,然后服务器将查找传递的B的装饰器(例如,基于类或任何其他标识符),创建传递B的装饰器(或仅创建一个),然后调用装饰器上的方法

    很像BufferedReader装饰任何Reader