...
| Code Block |
|---|
|
var CharArray = Java.type("char[]")
var jString = Java.type("java.lang.String")
var Character = Java.type("java.lang.Character")
function capitalize(s) {
if(s instanceof CharArray) {
return new jString(s).toUpperCase()
}
if(s instanceof jString) {
return s.toUpperCase()
}
return Character.toUpperCase(s) // must be int
}
var sw = new (Java.type("java.io.StringWriter"))
var FilterWriterAdapter = Java.extend(Java.type("java.io.FilterWriter"))
var cw = new FilterWriterAdapter(sw) {
write: function(s, off, len) {
s = capitalize(s)
// Must handle overloads by arity
if(off === undefined) {
cw_super.write(s, 0, s.length())
} else if (typeof s === "string") {
cw_super.write(s, off, len)
}
}
}
var cw_super = Java.super(cw)
cw.write("abcd")
cw.write("e".charAt(0))
cw.write("fgh".toCharArray())
cw.write("**ijk**", 2, 3)
cw.write("***lmno**".toCharArray(), 3, 4)
cw.flush()
print(sw)
|
| Anchor |
|---|
| Java_extend_super |
|---|
| Java_extend_super |
|---|
|
Java subclassing - Java.extend and Java.super - a larger example:
| Code Block |
|---|
| title | Java.extend and Java.super - larger example |
|---|
|
#// Usage: jjs -fx filebrowser.js -- <start_dir>
// Uses -fx and javafx TreeView to visualize directories
if (!$OPTIONS._fx) {
print("Usage: jjs -fx filebrowser.js -- <start_dir>");
exit(1);
}
// Java classes used
var File = Java.type("java.io.File");
var Files = Java.type("java.nio.file.Files");
// check directory argument, if passed
var dir = arguments.length > 0? new File(arguments[0]) : new File(".");
if (! dir.isDirectory()) {
print(dir + " is not a directory!");
exit(2);
}
// JavaFX classes used
var FXCollections = Java.type("javafx.collections.FXCollections");
var Scene = Java.type("javafx.scene.Scene");
var TreeItem = Java.type("javafx.scene.control.TreeItem");
var TreeView = Java.type("javafx.scene.control.TreeView");
// create a subclass of JavaFX TreeItem class
var LazyTreeItem = Java.extend(TreeItem);
// lazily filling children of a directory LazyTreeItem
function buildChildren(dir) {
var children = FXCollections.observableArrayList();
var stream = Files.list(dir.toPath());
stream.forEach(function(path) {
var file = path.toFile();
var item = file.isDirectory()?
makeLazyTreeItem(file) : new TreeItem(file.name);
children.add(item);
});
stream.close();
return children;
}
// create an instance LazyTreeItem with override methods
function makeLazyTreeItem(dir) {
var item = new LazyTreeItem(dir.name) {
expanded: false,
isLeaf: function() false,
getChildren: function() {
if (! this.expanded) {
// call super class (TreeItem) method
Java.super(item).getChildren().setAll(buildChildren(dir));
this.expanded = false;
}
// call super class (TreeItem) method
return Java.super(item).getChildren();
}
}
return item;
}
// JavaFX start method
function start(stage) {
stage.title = dir.absolutePath;
var rootItem = makeLazyTreeItem(dir);
rootItem.expanded = true;
var tree = new TreeView(rootItem);
stage.scene = new Scene(tree, 300, 450);
stage.show();
} |
Special treatment of objects of specific Java classes
...