2009-08-12 50 views
5

接口假设我有一个像如何在运行时创建

public class FooImpl 
{ 
    public void bar(){}; 
} 

有没有一种方法来创建它在运行时接口的类?

例如

public interface Foo 
{ 
    public void bar(); 
} 

我一直在寻找到Javasssist,真理是它的反射是我感兴趣的使用接口(如艾司科Luontola和伊沙依规定)

所以我想指定的子集的接口原始类'的方法来做代理。

我认识到还有更多的东西像

  • 予以关注你应该重用接口或创建一个新的每一次?
  • 该代理类实际上是一个类型为java.lang.reflect.Proxy的新实例,根据用例可能会引起含义。

最后一点让我想知道一些框架如何设法处理这个问题,他们深度复制对象吗?他们是否将代理封装在原始实例中?

所以也许这只是为了让客户端代码创建该类的接口更简单(尽管可能不那么优雅)。

+7

你为什么要这么做? – 2009-08-12 19:27:38

+2

在运行时做一个接口是否会影响接口的目的。 – 2009-08-13 13:03:14

+0

@SteveB。例如,如果我想打包一个pojo并让包装表达与pojo相同的接口(在编译时没有接口),该怎么办? – 2013-03-17 18:46:27

回答

2

您可以在类加载期间通过一些字节码操作/生成来完成此操作,例如使用ASM,Javassist或类似的,也可能是AspectJ

重要的问题是,为什么你需要这样做?没有普通的代码可以通过它的接口使用这个类,因为接口在编译时不存在。你可能需要生成使用接口的代码或使用反射 - 但在这种情况下,你可能会使用原始类。为了使接口有用,你应该也可以修改原始类,以便它实现生成的接口(这可以通过我提到的库来完成)。

+0

第二段为+1。 – 2009-08-13 13:12:18

1

你可以看看类似Javassist来创建类。您将使用Class.getMethods()来遍历该类,并且必须在运行时为接口实现字节码,然后使用类来桥接接口和实现。