2013-06-03 23 views
11

Tôi có một ứng dụng mà tôi muốn mở rộng bằng cách cho phép người dùng định nghĩa các lớp trong Groovy, cuối cùng là triển khai một số giao diện.Biên dịch và sử dụng các lớp Groovy từ Java lúc chạy?

Khía cạnh chính là nó phải được diễn giải/biên dịch khi chạy. I E. Tôi cần ứng dụng của mình để lấy số .groovy và biên dịch nó. Làm nó trong khi khởi động là ok.

Sau đó, tất nhiên, ứng dụng của tôi sẽ có thể khởi tạo lớp đó.

tôi thấy hai giải pháp:

1) Biên soạn trong khi chạy ứng dụng, đưa các lớp học ở đâu đó trên classpath, và sau đó chỉ cần tải các lớp học, giả vờ họ đã luôn ở đó.

2) Một số cách thông minh hơn - gọi API trình biên dịch và một số phép thuật nạp lớp để cho trình nạp lớp hệ thống của tôi xem chúng.

Tôi làm cách nào để thực hiện tùy chọn 2)?
Bất kỳ ý tưởng nào khác?

Trả lời

8

Có một cái nhìn tại Integrating Groovy into applications

  • Nhận lớp Loader
  • tải lớp
  • nhanh chóng lớp.

Beauty: -
Kể từ .groovy biên dịch để .class bytecode, phân tích các lớp sẽ cung cấp cho bạn một instanceofClass. Bây giờ nó trở thành tất cả thế giới JAVA, chỉ có sự khác biệt, một khi bạn nắm giữ GroovyObject sau khi giải phẫu, bạn chơi xung quanh gọi các phương thức theo yêu cầu.

Chỉnh sửa: Chỉ vì vậy nó có ở đây:

InputStream groovyClassIS = GroovyCompiler.class 
    .getResourceAsStream("/org/jboss/loom/tools/groovy/Foo.groovy"); 

GroovyClassLoader gcl = new GroovyClassLoader(); 
Class clazz = gcl.parseClass(groovyClassIS, "SomeClassName.groovy"); 
Object obj = clazz.newInstance(); 
IFoo action = (IFoo) obj; 
System.out.println(action.foo()); 

package org.jboss.loom.migrators.mail; 

import org.jboss.loom.tools.groovy.IFoo; 

public class Foo implements IFoo { 
    public String foo(){ 
     return "Foooooooooo Action!"; 
    } 
} 
Các vấn đề liên quan