如何在运行时创建接口

5
假设我有一个类,像这样:
public class FooImpl
{
    public void bar(){};
}

有没有办法在运行时创建它的界面?
例如:
public interface Foo
{
    public void bar();
}

我一直在研究Javassist,事实上,我对使用接口的反射感兴趣(正如Esko Luontola和Yishai所说)。
因此,我想要一个接口,它规定了从原始类中选择的一部分方法以便创建代理。
我意识到还有更多需要关注的事情,比如:
  • 你应该重用那个接口还是每次都创建一个新的接口?
  • 代理类实际上是java.lang.reflect.Proxy类型的新实例,这可能会根据用例产生影响。
最后一个问题让我想知道一些框架是如何处理这个问题的——他们是深度拷贝对象还是将代理封装在原始实例内?
因此,也许让客户端代码创建类的接口会更容易(虽然不够优雅)。

7
为什么你想要这样做? - Steve B.
2
在运行时创建接口违背了接口的设计初衷。 - James McMahon
@SteveB。例如,如果我想要包装一个POJO,并使包装器表达与POJO相同的接口(在编译时没有接口),该怎么办? - Jonas Eicher
2个回答

3
你可以通过在类加载过程中进行一些字节码操作/生成来实现,例如使用ASMJavassist或类似的工具,也可能使用AspectJ等。重要的问题是,为什么需要这样做?没有普通的代码能够通过接口使用该类,因为接口在编译时不存在。你要么需要生成使用该接口的代码,要么使用反射——但在这种情况下,你可能还不如使用原始类。而且,为了使接口有用,你还应该修改原始类,使其实现生成的接口(这可以使用我提到的库来完成)。

1
你可以查看 Javassist 这样的东西来创建类。你需要使用 Class.getMethods() 进行类的遍历,然后在运行时为接口实现字节码,并使用 Proxy 类来桥接接口和实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接