我如何通过反射构造对象时传递各种参数



我有一种情况,我使用反射在运行时根据它们的完全限定类名创建对象。所有的对象都扩展了同一个抽象类,所以它们的一般类型在编译时是已知的,但具体的实现是由运行时提供的类名决定的。

抽象类提供了一个名为create的静态方法,该方法接受类名和用于构造具体对象的其他参数。每个响应都有一个实际类型A和一个存储类型s。实际类型是数据在Java中的"适当"表示,存储类型是存储在数据库中的东西。例如,A可能是一个Date对象,S可能是同一个Date对象,转换成Long类型存储在SQLite中。

这里是一个简化的表示:

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;
    }
}

这个工作正常,直到我现在必须处理这样一个事实:除了每个响应实现接受的两个参数之外,一些响应实现现在需要接受额外的参数。

这些附加参数不能通过setter方法传递,因为它们通常用于从抽象响应构造函数中调用的包私有方法toActualValue()

我考虑过使用Builder模式来处理可选参数,但是我需要一种方法来确定哪个响应实现采用哪个参数——而且我想不出一种干净的方法来提供该信息。也许我完全想错了。如有任何有用的见解或建议,我们将不胜感激。

您考虑过使用任意数量的参数吗?

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

相关内容

  • 没有找到相关文章

最新更新