|
1 Nasgen is a tool for processing Java classes that implement native |
|
2 JavaScript objects. It does so by looking for the |
|
3 com.oracle.nashorn.objects.annotations.ScriptClass annotation and other |
|
4 annotations in that package. |
|
5 |
|
6 For each class "C", nasgen instruments the original class and generates |
|
7 two additional classes: a "C$Prototype" class for the JavaScript |
|
8 prototype object, and a "C$Constructor" class for the JavaScript |
|
9 constructor function. |
|
10 |
|
11 Each class instrumented or generated by nasgen contains a private static |
|
12 "$nasgenmap$" field of type com.oracle.nashorn.runtime.PropertyMap and |
|
13 static initializer block to initialize the field to the object's |
|
14 JavaScript properties. |
|
15 |
|
16 Members annotated with @Function, @Property, @Getter, and @Setter are |
|
17 mapped to the $Constructor, $Prototype, or main class, depending on the |
|
18 value of the annotation's 'where' field. By default, @Property, @Getter, |
|
19 and @Setter belong to the main class while @Function methods without |
|
20 explicit 'where' field belong to the $Prototype class. The @Constructor |
|
21 annotation marks a method to be invoked as JavaScript constructor. |
|
22 |
|
23 Nasgen enforces all @Function/@Getter/@Setter/@Constructor annotated |
|
24 methods to be declared as static. Static final @Property fields remain |
|
25 in the main class while other @Property fields are moved to respective |
|
26 classes depending on the annotation's 'where' value. For functions |
|
27 mapped to the $Prototype or $Constructor class, nasgen also generates |
|
28 getters and setters prefixed by G$ and S$, respectively. |
|
29 |
|
30 Nasgen-generated classes are hidden from normal ClassLoaders by giving |
|
31 them a ".clazz" file name extension instead of the standard ".class" |
|
32 extension. This allows script classes to be loaded independently by each |
|
33 Nashorn context through the com.oracle.nashorn.runtime.StructureLoader |
|
34 class loader. |