2011-11-09 26 views
6

Tôi sẽ viết giao diện Python-Java của riêng mình. Nó được biên dịch dưới dạng một tệp DLL và được bao bọc bằng cách sử dụng các loại ctypes.Giao diện Python-Java của tôi, thiết kế tốt? Và làm thế nào để bọc chức năng JNI?

Tuy nhiên, có thể tìm thấy các lớp Java và phân bổ các đối tượng Java. Nhưng giao diện nào sẽ là ngôn ngữ khác mà không sử dụng các đối tượng đó phương pháp? Mục tiêu của tôi là làm cho điều này là tự nhiên nhất có thể. Thật không may, không chỉ có thể tìm các phương thức Java chỉ theo tên.

mô hình của tôi là như sau:

JClass

  • Một thể hiện của lớp này đại diện cho một lớp Java.

JObject

  • Một thể hiện của lớp này đại diện cho một Java-đối tượng. Nó phải là được khởi tạo với phiên bản JClass. (Chưa, tất nhiên, sau đó nên có những lập luận cho các nhà xây dựng cũng có.)

JMethod

  • Đại diện cho một phương pháp của một Java-đối tượng. Nó chứa tên và chữ ký của phương pháp mong muốn. Chữ ký được đánh giá động bởi các lớp được đưa ra khi khởi tạo.

    Ví dụ:

    mainMethod = JMethod('main', JStringArray) 
    

    Lưu ý rằng JStringArray là một thể hiện của JClass đại diện cho một chuỗi mảng.

    Một JMethod có thể được thêm vào một trường hợp JClass. Nhưng sau đó có thể được gọi là chỉ từ một JObject instantiated.

JStaticMethod

  • Cũng giống như các JMethod, nhưng nó cũng có thể được gọi từ một JClass dụ.

Built-In các loại

  • tôi đang làm JInt, JShort, JLont, JChar, vv .. là built-in loại wrapper.

    Giống như:

    JInt = JClass('java/lang/Integer') 
    JShort = JClass('java/lang/Short') 
    JString = JClass('java/lang/String') 
    

Câu hỏi (s):

  1. Bạn nghĩ gì về thiết kế này?
  2. JNI-Functions cho các phương thức gọi của lớp Java/-object tất cả lấy số lượng đối số thay đổi. Sau khi đọc một số chủ đề trên gọi một hàm có đối số biến từ một hàm làm như vậy, và cũng đã đặt câu hỏi tại đây trên SO, tôi biết rằng điều này là không thể.
    Bây giờ, có các hàm không có số lượng đối số biến không nhưng là một số va_list hoặc một cái gì đó? Tôi chỉ cần tìm một số cách để gọi một phương thức từ Python trong Java!
+0

Chỉ cần nhìn vào câu trả lời của tôi từ 2 năm trước và nhận ra đó là sự thô lỗ không thể tin được ... Tôi thực sự xin lỗi vì điều đó. Cảm ơn vì đã không bị giật như tôi. –

Trả lời

11

1. Tôi nghĩ gì về thiết kế này?

  • không rõ vấn đề thực tế bạn đang cố giải quyết.

  • điều gì về các trường hợp cạnh; xử lý lỗi; khả năng tương thích về phía trước/sau; lỗi trong Python/Java? Không vui, nhưng cần thiết cho phần mềm mạnh mẽ.

  • trộn hai ngôn ngữ là đủ cứng, trộn ba chắc chắn sẽ tồi tệ hơn nhiều. Tôi mong đợi các vấn đề bảo trì và khớp nối lớn.

  • đã có giải pháp cho những vấn đề này. RPC, để nhận các chương trình bằng các ngôn ngữ khác nhau để nói chuyện với nhau. Jython, cho khả năng tương tác Java/Python. Tôi tin rằng, Jython thậm chí còn cho phép bạn tạo các đối tượng Python trong Java và ngược lại trực tiếp. Làm rõ mọi thiếu sót của các hệ thống hiện có này và cách bạn giải quyết những thiếu sót này, sẽ hữu ích.

Dưới đây là một vài điều còn thiếu:

  • gói
  • riêng tư
  • giao diện/lớp trừu tượng
  • phương pháp giải quyết: quá tải và ghi đè (đặc biệt là khi nhiều hơn một phương pháp sẽ phù hợp)
  • ngoại lệ
  • type-ch ecking hoặc khôi phục từ lỗi loại

2. Tôi chỉ cần tìm một số cách để gọi phương thức từ Python bằng Java! Còn Jython, RPC hoặc chỉ gọi một tệp thực thi thì sao?

+0

Tôi thích bài đăng của bạn. Ý kiến ​​chủ quan của bạn là thú vị đối với tôi. Tôi sẽ ghi nhớ những lý lẽ đó.Mặc dù nó không phải là câu trả lời cho câu hỏi thứ hai, nó * trả lời * câu hỏi đầu tiên rất tốt. 1, tôi muốn cung cấp cho nó 10. –

+2

Ngoài Jython, cũng có [JPype] (http://jpype.sourceforge.net/), cho phép bạn sử dụng Java từ CPython. – Steven

+0

@Steven - có vẻ thú vị, cảm ơn vì liên kết! –

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