java - 在运行时更改对象的实现接口(interface)

标签 java types dynamic-typing

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

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

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

最佳答案

您可以使用 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;
    }

}

关于java - 在运行时更改对象的实现接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28827801/

相关文章:

terminology - 静态/动态与强/弱

java - 自定义异常仅在 try/catch block 中调用时打印出 null

java - Firefox 私有(private)窗口上的 session 无效

GWT (JSNI) 中的 Javascript instanceof 和 typeof

go - 这是在 golang 中类型转换吗?

c++ - 嵌入式 C++ : dynamic typing without dynamic allocation?

objective-c - 参数是 KindOfClass : [NSNumber class] - sane way to check this?

java - 当我尝试更新 h :dataTable, 中的单元格时,它不会执行此操作

java - 迭代对象列表并验证属性 (int) 是否相互跟随(例如 : (1, 2,3,4)、(3,4,5,6),但不是 (1,2,5) 或 (3,4,5 ,7))

typescript - 为什么 TypeScript 会提示数组长度?