2012-07-23 5 views
5

Tôi đang cố gắng nhúng groovy vào một ứng dụng Java lớn.GroovyShell: thực thi được nhúng

Ứng dụng Java sẽ tải một số tập lệnh Groovy tiện ích khi khởi động.

Ứng dụng sau đó sẽ chạy các tập lệnh khác nhiều lần. Ngoài ra còn có một nhu cầu để nhập một số mã tại một GUI và thực hiện nó theo yêu cầu của người dùng.

Vấn đề tôi đang phải đối mặt với là thế này:

Tôi tải các tập lệnh khởi động như thế này:

GroovyShell gShell = new GroovyShell(); 
gShell.evaluate(new FileReader("scripts/autoload.groovy")); 

Giả autoload.groovy tôi bao gồm:

def prnt(m) { 
    println("From Groovy: " + m); 
} 

này hoạt động tốt . Nhưng khi tôi muốn chạy một lệnh người dùng sử dụng:

gShell.evaluate("prnt 66"); 

tôi nhận được lỗi: groovy.lang.MissingMethodException: No signature of method: Script2.prnt() is applicable for argument types: (java.lang.Integer) values: [66]

Làm thế nào có thể truy cập sử dụng kịch bản của tôi các phương pháp đã được nạp?

Lưu ý: Tôi cũng đã thử "autoload.prnt 88" và vẫn gặp lỗi.

Trả lời

4

Mỗi cuộc gọi evaluate được biên dịch và chạy như một riêng biệt Script, và

def prnt(m) { 
    println("From Groovy: " + m); 
} 

định nghĩa một phương thức trong lớp Script tạo ra từ autoload.groovy, mà không thể truy cập từ "kêu gọi" kịch bản tiếp theo. Tuy nhiên, các tập lệnh chạy bởi cùng một GroovyShell chia sẻ cùng một ràng buộc, vì vậy bạn có thể lưu trữ các giá trị trong ràng buộc từ một tập lệnh và truy cập chúng trong một tập lệnh khác. Lưu trữ một giá trị trong ràng buộc đơn giản chỉ là một trường hợp gán giá trị cho một biến khác không khai báo:

prnt = { m -> 
    println("From Groovy: " + m); 
} 

có thể lưu trữ đóng cửa trong các ràng buộc biến prnt, và bạn có thể gọi việc đóng cửa từ kịch bản khác trong cùng một vỏ . Lưu ý rằng

def prnt = { m -> 

hoặc

Closure prnt = { m -> 

sẽ không làm việc, vì def hoặc loại làm cho nó một khai báo biến cục bộ (riêng đến kịch bản này cụ thể) chứ không phải là một bài tập để các ràng buộc.