2011-01-07 14 views
5

Tôi đã có một tập hợp các Lớp cụ thể xác định một API và tôi muốn trích xuất Giao diện của các lớp này (ví dụ: về cơ bản phân cấp kiểu và phương thức công khai) từ triển khai thực tế API.Cách tự động để trích xuất giao diện từ một lớp Java

Vì vậy, ví dụ nếu một trong các lớp nào trong API là

public class Foo extends Bar { 
    /* some fields which I don't care about */ 

    public void method() { 
    /* implementation here */ 
    } 

    public void otherMethod() { 
    /* implementation goes here */ 
    } 

    /* some non public methods which I don't care about */ 

} 

Tôi muốn đột nhập vào một giao diện và một thực hiện

tức

public interface FooInterface extends BarInterface { 
    public void method(); 
    public void otherMethod() 
} 

public class Foo implements FooInterface { 
    /* etc etc */ 
} 

Có công cụ nào tôi có thể sử dụng để thực hiện việc tách này theo cách tự động hay không. sẽ phải cuộn chương trình của riêng tôi để thực hiện công việc? Nó cần phải là một công cụ đòi hỏi sự tương tác tối thiểu.

Trả lời

5

Tôi đã tìm thấy giải pháp!

Eclipse, có hỗ trợ cho các kịch bản tái cấu trúc, các tập lệnh nằm trong xml nhưng không thân thiện với con người nhưng tôi đã tạo các tập lệnh sao cho thực hiện nhật thực tất cả việc tái cấu trúc.

Để biết chi tiết của nhật thực toàn phần kịch bản tái cấu trúc, look here và sử dụng Eclipse để tạo ra một vài ví dụ cho bạn để bạn biết những gì kịch bản sẽ giống như

+0

Đây chính xác là những gì tôi đang tìm kiếm (tôi có kịch bản chính xác mà bạn đề cập đến)! Bất kỳ cơ hội nào bạn có thể chia sẻ tập lệnh tái cấu trúc bạn đã sử dụng? Tôi sẽ biến mất trong Eclipse để tìm ra điều này, nhưng tôi có thể sử dụng bất kỳ sự trợ giúp nào. Cảm ơn trước! – scorpiodawg

+0

Chà, XML được tạo ra trong "tập lệnh" không đẹp (như của Eclipse Indigo). Sẽ báo cáo lại nếu tôi nhận được một cái gì đó hữu ích trong số này. – scorpiodawg

3

Nhiều IDE, như IntelliJ, có một lệnh "Extract Interface" mà thực hiện một sắp xếp cho bạn: http://www.jetbrains.com/idea/features/refactoring.html#Extract_Interface

+1

nó có thể hoạt động trên nhiều tệp cùng một lúc không? Cho phép nói chọn tất cả các lớp trong một gói và thực hiện trích xuất giao diện? – hhafez

+1

Nếu bạn đang làm điều này cho tất cả các tập tin vì lợi ích của "độ tinh khiết" tôi đề nghị bạn suy nghĩ lại những lợi ích bạn đang thực sự đạt được. Cá nhân, tôi sẽ trích xuất giao diện ở đâu và khi nào nó có ý nghĩa và để mọi thứ khác như vậy. Nhưng sau đó, tôi không biết lý do của bạn. – Synesso

+0

Nó không phải vì lợi ích của "độ tinh khiết" và nó sẽ không được cho mỗi lớp, nhưng nó sẽ là tẻ nhạt để làm từng người một. – hhafez

1

Tôi khá chắc chắn rằng bạn sẽ phải cuộn công cụ của riêng bạn để làm công việc này; nó không phải là một cái gì đó mà nhiều nhà phát triển sẽ sử dụng, và những người đã sử dụng nó sẽ không sử dụng nó thường xuyên. Giải nén giao diện, được thực hiện đúng, thực sự cần thông minh (loại thật) hướng dẫn nó. Một công cụ đã trích xuất một cách mù quáng tất cả các thành phần được bảo vệ của & công khai và mù quáng xây dựng một hệ thống phân cấp giao diện để phản ánh phân cấp triển khai, cách xa thông minh và sản phẩm cuối cùng sẽ không đẹp. Phát triển trí thông minh (nhân tạo) để đưa ra quyết định tốt về những gì cần đưa vào và những gì để dẫn dắt - đó sẽ là một công cụ hữu ích, nhưng tôi thú nhận không thể tưởng tượng được với tôi. Những IDE hiện tại cung cấp - hỗ trợ có hướng dẫn - có lẽ là sự thỏa hiệp tốt nhất. Vui lên; nó ồ ạt ít tẻ nhạt hơn làm từng bước bằng tay!

+0

Tôi đồng ý nói chung đầu ra sẽ không đẹp, nhưng nó là điểm khởi đầu và nó chỉ xảy ra là những gì tôi cần trong tình huống cụ thể này (API tôi muốn refractor thực sự được tạo tự động từ một công cụ khác để cấu trúc thực sự cũng được xác định và do đó công cụ tái cấu trúc có thể khá thông minh trong trường hợp này) – hhafez

3

javap, một công cụ trong JDK, sẽ giúp bạn có được hầu hết những gì bạn muốn. Tuy nhiên, hãy chuẩn bị cho nó để không xử lý một số điều đúng - xin lỗi, tôi quên những gì, có thể chú thích, các lớp bên trong, một cái gì đó như thế.

Nếu nhúng javap trong bạn sở hữu ứng dụng Java sẽ giúp đỡ, bạn có thể làm một cái gì đó như thế này:

import sun.tools.javap.Main; 
... 
    void javap(String className) throws IOException 
    { 
     bos = new ByteArrayOutputStream(); 
     ourOut = new PrintStream(bos); 

     PrintStream oldOut = System.out; 
     System.setOut(ourOut); 

     String[] params = new String[] {"-public", className}; 
     Main.main(params); 

     System.setOut(oldOut); 

     String str = bos.toString(); 
    } 

này đòi hỏi sự tools.jar Sun JDK trong classpath.

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