我有一种情况,我使用反射在运行时根据其完全限定的类名创建对象。所有对象都扩展了相同的抽象类,因此它们的一般类型在编译时是已知的,但具体实现由运行时提供的类名确定。
抽象类提供了一个名为create的静态方法,它接受类名和用于构造具体对象的其他参数。每个响应都有一个实际类型A和一个存储类型S.实际类型是"适当的" Java中数据的表示形式和存储类型是存储在数据库中的东西。例如。 A可能是Date对象,S可能与在SQLite中存储转换为Long的对象相同。
这是一个简化的表示:
public abstract class Response<A, S> {
public Response(String clazz, Object value, boolean actual) {
this.clazz = clazz;
if (actual) {
actualValue = (A) value;
} else {
actualValue = toActualValue((S) value);
}
}
public static Response create(String clazz, Object value) {
//create response by reflection
return response;
}
}
这一点工作正常,直到我现在必须处理这样一个事实:除了每个Response实现所采用的两个参数之外,一些Response实现现在需要采用其他参数。
这些附加参数不能通过setter方法传递,因为它们通常用在从抽象Response构造函数中调用的包私有方法toActualValue()
中。
我已经考虑过使用Builder模式来处理可选参数,但是我需要一种方法来确定哪些Response实现采用哪些参数 - 而且我无法想出一种干净的方式来提供信息。也许我在想这完全错了。任何有用的见解或建议将不胜感激。
答案 0 :(得分:0)
您是否考虑过使用任意数量的参数?
public TestClass(String clazz, Object value, boolean actual, Object... parms) {
this.clazz = clazz;
if (actual) {
actualValue = (A) value;
} else {
//actualValue = toActualValue((S) value, parms);
}
}
https://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html
答案 1 :(得分:0)
Class.getMethod()和Class.getConstructor()都接受参数类型列表,因此您可以选择使用哪个重载方法/构造函数,您对反射有什么确切的问题?
它们通常用于受保护的方法toActualValue() 从抽象的响应构造函数中调用。
建议不要在构造函数中调用方法,或者至少将其限制为私有,最终或静态方法。