2009-08-12 87 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()來遍歷該類,並且必須在運行時爲接口實現字節碼,然後使用類來橋接接口和實現。