问题描述
|
这是场景:我有一个接口A,仅实现A的100个类B0 ... B99,以及扩展B0,B2 ... B98的50个类C0,C2 ... C98。
B类与MySQL数据库配合使用,对表进行各种处理。
C类为B类添加了额外的逻辑(验证,特权等)。
B类由工具生成,而C类由编码器编写。
客户端应用程序将使用B类,并且将无法访问C类。当为B对象调用方法时,客户端将序列化该对象并将其与要调用的方法名称一起发送到服务器应用程序。
服务器将接收B对象并将其强制转换为A。但是,服务器希望执行在C类中被覆盖的方法(如果存在这样的类),而从B中执行该方法。正常行为只能执行B中的方法。
如果没有庞大的SWITCH语句将接收到的对象转换为C,服务器将如何做到这一点?
编辑:我是Java新手,不知道反射可以做什么。在google(这个和这个)的一点帮助下,我解决了我的问题。我可以使用动态转换来实现自己的目标。感谢大家。
解决方法
好吧,您有一个运行时类型为B的对象,并且您要像将其作为C类型的对象一样调用它。除非它最初是作为C创建的,否则您不能向下转换为C,因为通常它不具有C的所有字段。
我猜想您的C类不会向B添加任何其他字段(如果这样做,您的问题就没有意义了)。由于它们没有添加任何其他字段,因此我可以看到将它们视为C会有什么意义,但是没有一个很好的方法。我会说:
为什么首先有B和C?为什么不仅仅拥有B类(具有所有特权等)并使用它呢?
如果失败,我想您可以使用反射。编写一些通用代码,这些通用代码接受您的任何B类对象,构造一个新的对应C对象,并在所有字段上进行复制。
,假设每个C类都有一个构造函数或一个静态createFromSuper可以从其父B(或从A)创建它。
您可以创建一个FactoryClass,在其中注册所有可用的C。您可以使用反射来获取要“替换”的C的父对象,同时记住Map / Hashtable中的每个B.class-> C.class映射。
然后,当您收到B时,将其传递给Factory,工厂在找到映射时将返回相同的B对象,或者调用构造函数/ createFromSuper返回C。
,这种方法对我来说真的很奇怪。为什么不只提供命令(例如,定义命令名称的字符串)并为这些命令注册命令对象?然后,您只需发送命令以及一些序列化参数即可。
编辑:
从您的描述来看,似乎C对象确实是B对象的装饰器。在那种情况下,它们将不会从相应的B继承而会引用它,然后服务器将为传递的B查找装饰器(例如,基于类或任何其他标识符),创建它们(或仅一个)传递B,然后在装饰器上调用该方法。
就像
BufferedReader
装饰任何Reader
一样。