2011-07-18 29 views
8

Tôi không rõ ràng về các quy tắc về cách các loại được chuyển đổi giữa Javascript và Java khi sử dụng (Mozilla) Rhino.Chuyển các loại phổ biến giữa Java và (Rhino) Javascript

Có một số chi tiết cụ thể trong tài liệu về String:

Điều quan trọng cần lưu ý rằng Java chuỗi và JavaScript dây không giống nhau [...] Rhino cung cấp một số giúp đỡ trong việc giảm sự khác biệt giữa hai loại. Đầu tiên, bạn có thể chuyển một chuỗi JavaScript đến một phương thức Java yêu cầu một chuỗi Java và tê giác sẽ thực hiện chuyển đổi. Chúng tôi đã thực sự thấy tính năng này hoạt động trên cuộc gọi tới hàm tạo java.lang.String trong ví dụ trước. Rhino cũng làm cho các phương pháp JavaScript sẵn cho chuỗi Java nếu lớp java.lang.String không đã định nghĩa chúng

Nhưng những gì về những người khác? Nếu tôi chuyển Số javascript sang phương thức Java, hãy chờ int, double (hoặc Integer hoặc Double), nó sẽ được chuyển đổi không? Điều gì về long/Long? (Mà sẽ không phù hợp trong một Double và như vậy sẽ không phù hợp trong một số JS?

gì về Java phương pháp trở về những giá trị này?

Sau đó có Boolean/boolean. Là những JS hằng truefalse chuyển đổi mã để và từ giá trị Java thích hợp? tôi đã nhìn thấy như

java.lang.Boolean.TRUE.booleanValue() 

sử dụng từ JS, vì vậy ít nhất một số người nghĩ nó không phải là.

tôi hav e nhìn vào tài liệu về Rhino của Mozilla nhưng chỉ ra nếu tôi đã bỏ sót điều gì đó hiển nhiên.

+0

Tôi đang đi qua một 'boolean' từ Java để * Javascript biên soạn với Rhino Java bytecode * và như xa như tôi có thể nói, nó được xử lý như một Boolean trong Javascript quá. Nhưng đó chỉ là 'boolean'. – KajMagnus

Trả lời

5

Dưới đây là cách nó chuyển đổi các loại JavaScript sang các loại Java: http://www-archive.mozilla.org/js/liveconnect/lc3_method_overloading.html#InvocationConversion.

Thử:

$ java -cp js.jar org.mozilla.javascript.tools.shell.Main 

js> new java.lang.Integer(12345) 
12345 
js> new java.lang.Integer(12345) == 12345 
true 

js> new java.lang.Double(12345.12345) 
12345.12345 

js> new java.lang.Long(9223372036854775807)     
js: Cannot convert 9223372036854776000 to java.lang.Long 
js> 9223372036854775807 
9223372036854776000 
js> new java.lang.Long("9223372036854775807") 
9223372036854775807 
js> new java.lang.Long("-9223372036854775808") 
-9223372036854775808 

js> new java.lang.Boolean(true) 
true 
js> new java.lang.Boolean(true) == true 
true 
js> new java.lang.Boolean(true) == false 
false 
js> java.lang.Boolean.TRUE.booleanValue() == true 
true 
js> java.lang.Boolean.FALSE.booleanValue() == false 
true 

UPD

Đáng tiếc là tôi không thể tìm thấy bất kỳ tài liệu về bản đồ kiểu JavaScript-từ-Java một trong hai. Nhưng tutorial cho thấy các đối tượng JavaScript được chèn vào và lấy ra từ ngữ cảnh như Java Object s thực sự có thể là Double s, Boolean s, Function s (đối với các hàm JavaScript; thực hiện Scriptable) hoặc Scriptable s (đối với các đối tượng).

Sử dụng this code snippet nó có thể để có được JavaScript Java tài liệu tham khảo loại bản đồ:

https://gist.github.com/1089320#file_java_script_java_type_mapping.textile

Đối với khả năng tương thích LiveConnect.Nếu bạn đang đề cập đến chú thích này:

Khả năng gọi Java từ JavaScript lần đầu tiên được triển khai là một phần của công nghệ trình duyệt Netscape được gọi là LiveConnect. Tuy nhiên, vì công nghệ đó cũng bao gồm giao tiếp với trình duyệt plugin và vì cách gọi JavaScript từ Java trong Rhino là hoàn toàn khác, thuật ngữ đó sẽ không được sử dụng trong bài báo này.

Tôi nghĩ rằng việc sử dụng JavaScript từ Java khác với đặc điểm của LiveConnect. Sử dụng Java từ JavaScript phải giống nhau.

+0

Cảm ơn. Điều đó rất hữu ích. Nhưng trừ khi tôi đang thiếu một cái gì đó bảng điểm của bạn là nhiều hơn về cách Javascript đang xử lý các loại Java hơn so với những gì một phương pháp Java sẽ thấy nếu thông qua một giá trị cho Javascript? –

+0

Ngoài ra, có một nhận xét về "khả năng tương thích Rhino" trên các lồng khác của LiveConnect trên trang web đó để tài liệu có thể không áp dụng đầy đủ cho Rhino. Bạn có biết cách chuyển đổi LC3 (như được ghi chép ở đó) và chuyển đổi Rhino có liên quan không? Họ được biết là giống hệt nhau? –

+0

@Paul Vui lòng xem cập nhật. – pingw33n

2

Trên thực tế tôi đã có một vấn đề ngay cả với việc chuyển đổi "tự động", kết thúc chuyển đổi bản thân mình:

function javaToJavaScript(str) 
{ 
    len = str.length(); 
    tmp = ""; 
    for (var i=0; i<len; i++) 
     tmp += String.fromCharCode(str.charAt(i)); 
    return tmp; 
} 
+0

Chưa bao giờ gặp sự cố với Chuỗi so với chuỗi. Các vấn đề bạn gặp phải là gì? –

+0

Hàm Java được gọi từ JavaScript trả về một chuỗi Java. Tôi tự hỏi một chút thời gian, tại sao 'str.length' không hoạt động như mong đợi (trả về một hàm, không phải số nguyên như tôi nghĩ). – lama12345

+0

Đối với tôi, chữ ký thay thế quá khác nhau. –

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