2013-08-04 17 views
16

Tôi đang tìm các triển khai hiện có của ý tưởng sau đây: giả sử ai đó muốn viết các mã byte "inline assembly" bên trong một chương trình Java bình thường (các ứng dụng liên quan nhất sẽ liên quan đến hướng dẫn động) nếu không có sẵn trong Java). Một cách để làm điều này sẽ như sau:"Inline assembly" cho các mã byte Java

void foo(boolean b) { 
    Label l1 = Asm.label(); 
    Label l2 = Asm.label(); 

    int i = Asm.no_int(); 
    Asm._const(0); 
    Asm.store(i); 
    l1.bind(); 
    Asm.load(i); 
    Asm.push(10); 
    Asm.if_cmpge(l2); 
    Asm.getstatic("java/lang/System", "out", "Ljava/io/PrintStream"); 
    Asm.load(i); 
    Asm.invokevirtual("java/io/PrintStream", "println", "(I)V"); 
    Asm.inc(i); 
    Asm._goto(l1); 
    l2.bind(); 
    Asm._return(); 
} 

hướng dẫn được mã hóa như các cuộc gọi API, sau đó chúng tôi cần phải chạy một trình biên dịch java bình thường, và sau đó để gửi quá trình mã byte và thay thế các cuộc gọi API với hướng dẫn thực tế.

P.S. Tôi biết ASMifier của ASM Framework, nó không giải quyết được vấn đề nêu trên.

+0

Chúng ta không có Giao diện bản địa Java cho điều này? – user2357112

+2

JNI dành cho các giao diện giữa "triển khai gốc" (được thực hiện trong C, C++), anh ta yêu cầu "bytecode nội tuyến" – morgano

+0

... oh! Intecode nội tuyến. Tôi nghĩ rằng đây là một câu hỏi về nội tuyến lắp ráp thực tế trong một chương trình Java. – user2357112

Trả lời

6

ClassLoader có phương thức, defineClass, cho phép bạn tạo động một lớp bằng cách cung cấp bytecode. Kết hợp điều này với Javassist hoặc các đề xuất khác từ câu hỏi previous này.

+0

Tôi đang tìm kiếm cụm từ _inline_. –

1

Nếu bạn đang tìm kiếm "nghệ thuật trước" cho một bằng sáng chế, tôi nghĩ rằng trình biên dịch mã gốc JNode đã thực hiện loại điều này với một số phương thức trong phiên bản của lớp học Unsafe. Tuy nhiên, nguyên thủy không phải là bytecode. Thay vào đó họ là những thứ không thể diễn tả như bytecode.


Tiêm bytecode như vậy không có vẻ như là một ý tưởng tốt với tôi:

  • Có nhiều cách tốt hơn để làm điều đó; ví dụ. BCEL.

  • Có thể khó khăn (đối với lập trình viên) để tích hợp những gì các bytecode được tiêm đang cố gắng thực hiện với phần còn lại của phương thức. Đặc biệt là xem xét rằng bytecodes cho phần còn lại của phương pháp sẽ phụ thuộc vào trình biên dịch java bạn đang sử dụng.

  • Đối với Java trên nền tảng JVM thông thường, bạn cần thực hiện bản dịch của Asm "cuộc gọi" sang bytecodes ... trước khi lớp được tải. Sau đó nó sẽ được kiểm tra bởi người xác minh.

+0

Bằng sáng chế là điều ác. Tôi chỉ đang tìm kiếm một số triển khai của cùng một ý tưởng. –