在运行时更改对象的已实现接口

时间:2015-03-03 09:07:19

标签: java types dynamic-typing

是否可以动态添加到对象实现的接口列表中(这样instanceof返回true并且强制转换不会失败)?

我有一组对象,其类型需要在运行时动态更改。随着状态的变化,更多的方法/属性变得有效。目前,这是以“暴力”方式完成的......所有成员都暴露在外,并且在错误的时间调用错误的成员是一个错误。理想情况下,我想使用静态类型,并将这些对象传递给期望特定接口的方法。对象实现的接口集只会增加,因此旧引用仍然有效。

是否可以在运行时更改对象的已实现接口,使用内置反射还是通过第三方字节码操作?

1 个答案:

答案 0 :(得分:2)

您可以使用Proxy,但正如评论所示 - 这几乎总是不是最佳选择。

你最好把你的对象塑造成多面的。

interface Interface1 {

    String getI1();
}

interface Interface2 {

    String getI2();
}

class Multifaceted {

    String i1;
    String i2;

    private final Interface1 asInterface1 = new Interface1() {

        @Override
        public String getI1() {
            return i1;
        }

    };

    private final Interface2 asInterface2 = new Interface2() {

        @Override
        public String getI2() {
            return i2;
        }

    };

    public Interface1 asInterface1() {
        if ( i1 == null ) {
            throw new InvalidStateException("I am not ready to be one of these yet!");
        }
        return asInterface1;
    }

    public Interface2 asInterface2() {
        return asInterface2;
    }

}