有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

运行时类是否在Java中实现接口?

假设我有这样的课程:

class A
{
}

无论如何,我都可以使类implements成为运行时上的接口

这就是我试图实现的,当有人创建类A的对象时,我需要拦截对该对象的调用

非常熟悉Java,谢谢


共 (4) 个答案

  1. # 1 楼答案

    你可以用Instrumentation来实现这一点,但是我不会这么做,除非你非常了解Java和字节码,而且真的没有其他选择

    更好的选择是使用组合或继承

    class A {
    }
    
    class B extend A implement I {
         // B is an A and implements I
    }
    A a = new B();
    
    class C implement I {
         A a;
    }
    

    B或C实现你的接口而不必改变A

  2. # 2 楼答案

    可以使用Proxy对象在运行时调整任何对象,使其看起来好像实现了一个接口

    有一篇很好的文章here讨论了一种工厂方法,用于对对象执行此操作

    本质上,Proxy对象可以通过拦截对对象的所有方法调用并动态重定向来包装对象

  3. # 3 楼答案

    这应该可以通过适配器解决。定义一个实现接口并委托给真实对象的其他类:

    class YourAdapter implements YourInterface {
    
        private final YourClass realObject;
    
        public YourAdapter(YourClass realObject) {
            this.realObject = realObject;
        }
    
        @Override
        public methodFromInterface() {            
            realObject.methodFromInterface();
        }
    
        // .......
    
    }
    

    现在,给定一个需要YourInterface和类型为YourClass的对象的方法:

    void someMethod(YourInterface param) {}
    
    void test() {
        YourClass object = getFromSomewhere();
        someMethod( YourAdapter(object) );
    }
    

    第二种方式: 使用代理类:

    请参阅this链接

    Example使用动态代理动态实现接口

  4. # 4 楼答案

    不能使类在运行时实现接口。在运行时可以做的最好的事情就是为类创建一个动态的子类,它还实现了一个接口

    根据Liskov替换原则,这个解决方案将非常有效,因为针对类型A编写的任何代码也将针对其子类型。此外,针对您正在实现的接口编写的任何代码也可以工作,并且能够访问在类A中实现的行为,在一定程度上,这种行为通过接口方法的行为反映出来