如何通过反射构造对象时传递不同的参数?

时间:2015-08-05 13:32:46

标签: java oop reflection

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

抽象类提供了一个名为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实现采用哪些参数 - 而且我无法想出一种干净的方式来提供信息。也许我在想这完全错了。任何有用的见解或建议将不胜感激。

2 个答案:

答案 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()   从抽象的响应构造函数中调用。

建议不要在构造函数中调用方法,或者至少将其限制为私有,最终或静态方法。