2010-10-02 32 views
6

Tôi đang tạo một falling sand game bằng Java. Tôi muốn người dùng có thể viết động cơ của riêng họ cho nó bằng một ngôn ngữ đơn giản hơn. Trò chơi cát rơi có thể rất tốn kém CPU nên tôi muốn động cơ chạy nhanh nhất có thể trong khi không phải biên dịch thủ công.Làm thế nào để biên dịch tệp rhino/javascript sang .class bytecode cho java tại thời gian chạy

Tôi cần biết cách biên dịch tệp rhino javascript thành tệp .class theo thời gian chạy sẽ được sử dụng.

Tôi đã tìm cách nhưng không thể tìm thấy bất kỳ cách nào khác ngoài cách biên dịch thủ công bằng cách sử dụng dòng lệnh mà tôi không muốn người dùng phải làm.

+0

Vì vậy, về cơ bản bạn biết làm thế nào để làm điều đó? nhưng bạn muốn điều này được thực hiện tự động và người dùng không cần bận tâm về việc thay đổi tập lệnh tê giác thành .class? cho điều này, bạn có thể cung cấp cho họ một tập tin batch có thể phục vụ cho mục đích của bạn ... – Varun

Trả lời

4

Có một hướng dẫn ngắn ở đây:

+0

Mẫu mã trong bài viết này có một chút sai sót, đó là gọi hàm 'fib (num);' nên nằm sau định nghĩa của cái đó . cảm ơn. –

+0

Bài báo này nêu rõ, rằng tê giác không thể biên dịch .js thành .class, mặc dù nó có thể. – peterh

1

Bạn có thể biên dịch kịch bản của bạn trong thời gian chạy bằng Context.compileString(). Điều này tạo ra một đối tượng Script mà bạn có thể tái sử dụng.

Script s = someContext.compileString(myScript, "<cmd>", 1, null); 

// Store s, cache it in a map or something, maybe even serialize and persist it. 

// Later... 

Object result = s.exec(anotherContext, someScope); 

Sự khác biệt hiệu suất giữa thứ gì đó như thế này và sử dụng Context.evaluateString() có thể dễ dàng có nhiều đơn đặt hàng nhanh hơn.

0

Bạn có thể thử các mẫu sau:

void toClassFile(String script) throws IOException { 
    CompilerEnvirons compilerEnv = new CompilerEnvirons(); 
    ClassCompiler compiler = new ClassCompiler(compilerEnv); 
    Object[] compiled = compiler.compileToClassFiles(script, null, 1, "javascript.Test"); 
    for(int j = 0; j != compiled.length; j += 2) { 
     String className = (String)compiled[j]; 
     byte[] bytes = (byte[])compiled[(j + 1)]; 
     File file = new File(className.replace('.', '/') + ".class"); 
     file.getParentFile().mkdirs(); 
     try (FileOutputStream fos = new FileOutputStream(file)) { 
      fos.write(bytes); 
     } 
    } 
} 
Các vấn đề liên quan