【发布时间】:2015-10-08 21:15:18
【问题描述】:
例如。我有一百个或更多类 A、B、C... 无法更改。并从外部来源接收它们。这些类中的每一个都有子类 {A1, A2, ... An}, {B1}, {C1, C2} ...我应该根据它的超类创建它们。 但大多数超人只有一个子
我只能看到两种变体:
-
我为每个类层次结构创建了一百个工厂方法(或构造器)以获取子类。 比如:
public static <Sub extends A> Sub buildSubClass(A superc) { Sub subclass; if(isA1(superc)) { subclass = new A1(); subclass.setField(superc.getField()) // etc for each field of A class } else if(isA2(superc)) { subclass = new A2(); subclass.setField(superc.getField()) // .... } // etc. return subclass; } -
我可以使用反射吗
public static <S, T> T castObject(S source, Class<T> targetClass) { T newInstance = targetClass.newInstance(); for (Field field : source.getClass().getDeclaredFields()) { for (Field fieldTarget : targetClass.getDeclaredFields()) { if (isFieldsEqual(field, fieldTarget)) { setField(getField(field, source), fieldTarget, newInstance); } } } return newInstance; }
有 java 更优雅的方式将对象转换为子类对象吗?对我来说理想的方法只是将对象签名更改为不创建 A 子类的新实例,而是将其更改为使 java 将其视为子类对象的实例(带有新字段)。 比如:
A superc = new A();
A1 sub = (A1) superc;
我现在不行了,但我想要这样的东西;
【问题讨论】:
-
这不清楚。什么是
isA1、isA2等?你到底想在这里做什么? (即为什么您需要以通用方式动态创建这数百个子类的实例?) -
一些抽象布尔函数,用于确定应该创建哪个子类对象。实际上在这种情况下并不重要。
-
方式可能不通用。我只是寻找避免许多 set(get()) 语句的方法
-
我将从平面文件中命名的类列表构建一个代码生成器。丑陋,是的,但如果这是一次性工作,最简单的方法......并使用代码生成器构建您的工厂类
标签: java class reflection casting