替换方法重载中的java反射

时间:2016-02-20 18:06:56

标签: java reflection overloading

我有以下类层次结构:

<code>
public interface Decorator <T> {
    T decorate(String data);
}
public class StringDecorator implements Decorator<String> {
    @Override
    public String decorate(String data) {
        return "Decorated Data";
    }
}
public class IntegerDecorator implements Decorator<Integer> {
    @Override
    public Integer decorate(String data) {
        return 0;
    }
}
public class MyPrint {
    public void printData(String data) {
        System.out.println("String Data: " + data);
    }
    public void printData(Integer data) {
        System.out.println("Integer Data: " + data);
    }
}
</code>

有了上面的结构,我想首先调用一些装饰器函数并将相同的结果传递给printData方法。我可以在java反射的帮助下实现这一点,如下所示:

<code>
void callerFunction(Decorator decorator, MyPrint myPrint){
    // Below line would call appropriate decorator depending on injected type
    Object decoratedData = decorator.decorate("test");
    try {
        // Java reflection to figure out an appropriate overloaded method to be invoked
        myPrint.getClass().getMethod("printData", decoratedData.getClass()).invoke(myPrint, decoratedData);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
</code>

有没有更好的方法来实现相同而不使用反射?用例是根据装饰器返回的数据类型调用适当的printData重载函数(不使用instanceOf上的​​if else)。

感谢。

1 个答案:

答案 0 :(得分:0)

我可以想到两个解决方案。

首先,您无需担心重载printData,而是依赖于在每个类中定义合适的toString方法:

 public void printData(Object data) {
    System.out.println("Data: " + data);
}

其次,您可以使用泛型定义打印数据方法,例如在每个装饰器中

public interface Decorator <T> {
    T decorate(String data);
    void printData(T object);
}

或者等效地你可以定义一个单独的printData接口,然后你的装饰器类也需要创建一个相应的printData类。