2013-03-21 37 views
12

Có ai có bất kỳ ví dụ nào về việc sử dụng Dịch vụ móc dệt OSGi 4.3+ không? Còn AspectJ, ASM, JavaAssist thì sao? Có ai thực sự đang sử dụng OSGi WeavingHooks không?Ví dụ về cách xử lý dệt OSGi

Ví dụ trong phần OSGi Core 5.0.0 56.2 chỉ đơn giản là loại bỏ phần dệt thực tế và nói "phần dệt cuối cùng được để lại dưới dạng bài tập cho người đọc".

Mục tiêu của tôi là:

  1. tạo chú thích (@MyAnnotation) mà tôi có thể đặt trên các lĩnh vực (nguyên thủy hoặc đối tượng).
  2. tạo org.osgi.framework.hooks.weaving.WeavingHook để dệt các lớp học với chú thích rằng
  3. sử dụng thời gian nạp dệt để pointcut tại bất kỳ sửa đổi các lĩnh vực với chú thích rằng
  4. sự kiện EventAdmin lửa mà lĩnh vực này đã đã sửa đổi.
  5. tự động cập nhật kết nối gói từ WeavingHook thành dây đến gói EventAdmin.

Vấn đề của tôi chủ yếu là # 3.

Tôi hiện đang cố gắng sử dụng AspectJ WeavingAdaptor để làm dệt, nhưng tôi đang gặp vấn đề nhận được thư viện khía cạnh của tôi vào nó, vì kỳ vọng của nó java.net.URL [] aspectURLs trong constructor là một trong hai thư mục hoặc thư mục mà nó có thể tìm thấy trên hệ thống tệp và không phải là các gói. Ngoài ra, tôi không chắc chắn làm thế nào để xử lý bất kỳ lớp học mới được tạo ra bởi các thợ dệt thông qua callbacks để acceptClass (String name, bytes []) phương pháp GeneratedClassHandler.

Có thể WeavingAdaptor không phải là nơi thích hợp để bắt đầu việc dệt của tôi? Hoặc có lẽ tôi không nên sử dụng AspectJ?

MyAnnotation.java

@Target(ElementType.FIELD) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface MyAnnotation { 
} 

MyWeavingHook.java

public class MyWeavingHook implements WeavingHook { 

    public class MyWeavingClassloader implements WeavingClassLoader { 

     private Bundle b; 

     public MyWeavingClassLoader(Bundle b) { 
      this.b = b; 
     } 

     void acceptClass(java.lang.String name, byte[] bytes) { 
      //no way to get this back into the woven classes bundle classloader? 
     } 

     URL[] getAspectURLs() { 
      //how do I get a handle to my aspect library that AspectJ can understand? 
     } 
    } 

    public void weave(WovenClass myclass) { 
     Bundle b = Framework.getBundle(MyWeavingHook.class); 
     WeavingClassLoader wc = new WeavingClassLoader(b); 
     WeavingAdaptor w = new WeavingAdaptor(wc); 
     if (shouldWeave(myclass)) 
      myclass.setBytes(w.weave(myClass.getBytes())); 
     //should catch exceptions 
    } 

    private boolean shouldWeave(WovenClass myclass) { 
     //not sure of the best logic to pick which classes to weave yet 
    } 
} 

MyAspect.aj

privileged aspect MyAspect { 
    after() : set(* *) && @annotation(MyAnnotation) { 
     //send EventAdmin event 
    } 
} 

MyTestClass.java

public class MyTestClass { 
    @MyAnnotation 
    private int myField; 

    public void doSomething() { 
     //do stuff with myField 
    } 
} 

tôi có thể sử dụng Spring AOP, nhưng tôi muốn điều này để làm việc cho bất kỳ gói, không chỉ đậu instantiated qua mùa xuân hoặc Blueprint. Ngoài ra, Equinox Weaving dường như không sử dụng đặc tính móc dệt OSGi và tôi không muốn bị ràng buộc với Equinox. Tôi không có vấn đề loại bỏ AspectJ nếu một cái gì đó khác hoạt động tốt hơn.

Tham chiếu đến một câu hỏi tương tự: Is it possible to do bytecode manipulation when using OSGi?

UPDATE:

Kết quả cuối cùng là tôi chỉ sử dụng các khía cạnh Equinox và cài đặt nó vào Karaf. Có 3 gói, một thư viện và thuộc tính hệ thống.Tôi sẽ sử dụng nó cho đến khi họ hoặc cập nhật nó cho chúng tôi OSGi dệt hoặc tôi viết móc dệt OSGi của riêng tôi để sử dụng mã AspectJ tương tự như Equinox Aspects. Tôi không thích các chỉ số dệt cần thiết để có được Equinox Aspects để làm việc vì nó giới thiệu một yêu cầu-bó/reexport hoặc một gói nhập khẩu trên AspectJ RT trong bó được dệt. Sự phụ thuộc này nên được thêm vào động và được khuyên dùng bên ngoài gói.

+0

Đối với móc dệt OSGi, bạn nhận được một byte [] của lớp mà bạn cần sửa đổi. Bạn không được cố tải byte bị biến đổi []. Điều đó sẽ được thực hiện bởi khung công tác OSGi sau khi tất cả các móc dệt được gọi. –

+0

@BJHargrave có, đó là những gì spec nói. Câu hỏi đặt ra là, các khung công tác hoặc thư viện nào tương thích với OSGi và dễ dàng gắn bó với phương thức WeavingHook.weave() mà tôi có thể sửa đổi byte lớp gốc [] ... và có bất kỳ ví dụ nào của bất kỳ ai thực sự làm điều này không? –

+0

ASM hoặc BCEL đến với tâm trí. –

Trả lời

2

Hãy xem ProxyWeavingHook từ mô-đun Proxy của Apache Aries. Nó sử dụng thư viện ASM trực tiếp để sửa đổi bytecode vì vậy mức độ thấp hơn.

+1

Bạn là câu trả lời duy nhất và câu trả lời hợp lý của nó. Kết quả cuối cùng là tôi chỉ sử dụng Equinox Aspects và cài đặt nó vào Karaf. Có 3 gói, một thư viện và thuộc tính hệ thống. Tôi sẽ sử dụng nó cho đến khi họ hoặc cập nhật nó cho chúng tôi OSGi dệt hoặc tôi viết móc dệt OSGi của riêng tôi để sử dụng mã AspectJ tương tự như Equinox Aspects. Tôi không thích các chỉ số dệt cần thiết để có được Equinox Aspects để làm việc vì nó giới thiệu một yêu cầu-bó/reexport hoặc một gói nhập khẩu trên AspectJ RT trong bó được dệt. Sự phụ thuộc này nên được thêm động và được khuyên dùng bên ngoài gói. –

0

WeavingAdaptor hy vọng WeavingClassLoader của bạn sẽ được bắt nguồn từ URLClassLoader để cả hai nhà thầu có sẵn về cơ bản cũng làm điều tương tự cuối cùng. Thanh toán http://www.slideshare.net/mfrancis/bytecode-weaving để xem cách BundleWiring có thể được sử dụng để có quyền truy cập vào URL đường dẫn lớp. Bạn có thể thêm các gói thời gian chạy AspectJ vào wovenClass.getDynamic'Imports() để tránh tham chiếu AspectJ trực tiếp. BundleWiring cũng là cách để cung cấp các url AspectJ cho WeavingAdaptor.

Tôi nghĩ rằng không có cách nào để hỗ trợ các lớp mới đến từ acceptClass vì móc dệt nói rằng nhập khẩu động chỉ có thể được sử dụng trong khi bên trong phương thức dệt.