2009-08-12 31 views
5

Giả sử tôi có một lớp nhưLàm thế nào để tạo ra một giao diện tại Runtime

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

Có cách nào để tạo ra giao diện của nó trong thời gian chạy?

ví dụ:

public interface Foo 
{ 
    public void bar(); 
} 

Tôi đã được nhìn vào Javasssist và sự thật là nó phản ánh rằng tôi quan tâm đến việc sử dụng giao diện cho (như Esko Luontola và Yishai nêu)

Vì vậy, tôi muốn có một giao diện mà xác định một tập hợp con các phương thức của lớp ban đầu để tạo proxy.

Tôi đã nhận ra có nhiều điều cần được quan tâm về như

  • bạn nên tái sử dụng giao diện đó hoặc tạo một hình mới mỗi lần?
  • Lớp proxy có hiệu quả là một thể hiện mới của loại java.lang.reflect.Proxy, điều này có thể gây ra các tác động tùy thuộc vào trường hợp sử dụng.

Điểm cuối cùng khiến tôi tự hỏi về cách một số khung công tác quản lý để xử lý việc này, chúng có sao chép sâu đối tượng không? chúng có đóng gói proxy bên trong cá thể ban đầu không?

Vì vậy, có thể nó dễ dàng hơn (mặc dù có thể không thanh lịch) để yêu cầu mã máy khách tạo giao diện cho lớp.

+7

Tại sao bạn muốn thực hiện việc này? –

+2

Vâng làm một giao diện trong thời gian chạy đánh bại mục đích của giao diện. –

+0

@SteveB. Điều gì sẽ xảy ra nếu, ví dụ, tôi muốn bọc một pojo và có trình bao bọc thể hiện giao diện tương tự như pojo (không có giao diện lúc biên dịch)? –

Trả lời

2

Bạn có thể làm điều đó với một số thao tác bytecode/thế hệ trong quá trình tải lớp, ví dụ: sử dụng ASM, Javassist hoặc tương tự, có thể cũng AspectJ.

Câu hỏi quan trọng là, tại sao bạn cần phải làm điều đó? Không có mã bình thường nào có thể sử dụng lớp thông qua giao diện của nó, bởi vì giao diện không tồn tại ở thời gian biên dịch. Bạn sẽ cần phải tạo mã sử dụng giao diện hoặc sử dụng sự phản chiếu - nhưng trong trường hợp đó bạn cũng có thể sử dụng lớp gốc. Và để giao diện hữu ích, bạn có lẽ cũng nên sửa đổi lớp gốc để nó thực hiện giao diện được tạo (điều này có thể được thực hiện với các thư viện mà tôi đã đề cập).

+0

+1 cho đoạn thứ hai. –

1

Bạn có thể xem một số thứ như Javassist để tạo lớp học. Bạn sẽ đi qua lớp với Class.getMethods() và phải thực hiện bytecode khi chạy cho giao diện, và sau đó sử dụng lớp Proxy để nối giao diện và thực hiện.

Các vấn đề liên quan