2010-08-06 5 views
4

Quelqu'un peut-il me donner un exemple sur la façon d'étendre une classe java dans un script java en utilisant l'adaptateur Java de Rhino?Exemple utilisant JavaAdapter de rhino

+1

Java! = JavaScript. Jamais a été, ne sera jamais. –

+8

@A. Scagnelli: C'est vrai, mais Rhino vous permet de scripter java. http://www.mozilla.org/rhino/ – TheLQ

+0

Regardez cette page: http://www.mozilla.org/rhino/ScriptingJava.html –

Répondre

1

Dépend de que vous souhaitez hériter. Je trouve que si j'utilise le prototype JavaScript pour objet « définitions » Je reçois les méthodes statiques de Java objets uniquement:

function test() { 
    this.hello = function() { 
    for(var i in this) { 
     println(i); 
    } 
    }; 
} 
test.prototype= com.acme.app.TestClass; // use your class with static methods 
// see the inheritance in action: 
var testInstance=new test(); 
test.hello(); 

Cependant, JavaScript vous permet de faire des missions de prototypes sur les instances d'objet aussi bien, de sorte que vous pouvez utiliser une fonction comme celui-ci, et d'obtenir un comportement d'héritage plus de type Java:

function test(baseInstance) { 
    var obj = new function() { 
    this.hello=function() { 
     for(var i in this) { 
     println(i); 
     } 
    }; 
    }; 
    obj.prototype=baseInstance; // inherit from baseInstance. 
} 

// see the thing in action: 
var testInstance=test(new com.acme.TestClass()); // provide your base type 
testInstance.hello(); 

Ou utiliser une fonction (par exemple init) similaire à la fonction ci-dessus dans l'objet lui-même:

+0

ceci n'est pas lié à la question. il parle de JavaAdapter de rhino – oberhamsi

2

Depuis que je ne suis pas sûr à 100% que par Java Adapter vous dire ce que je pense qu'il est, les interfaces Java et telles peuvent être créées avec des listes de propriétés (nom = function()):

var runnable = new java.lang.Runnable({ 
    run: function() { println('hello world!'); } // uses methodName: implementationFunction convention 
}; 
java.awt.EventQueue.invokeLater(runnable); // test it 

Ou bien pour des choses une seule méthode comme ça:

function runnableFunc() { println('hello world!'); } 
var runnable = new java.lang.Runnable(runnableFunc); // use function name 
java.awt.EventQueue.invokeLater(runnable); // test it 
+0

Merci pour votre réponse – kishore

+0

Comment pouvez-vous étendre une autre classe comme ça? N'auriez-vous pas besoin de 'JavaAdapter'? –

+0

Avec 'prototype', pour un exemple s'il vous plaît voir mon autre réponse. – user268396

6

pour toute autre personne qui pourrait venir à travers cela, il y a un exemple décent here (l'auteur utilise pour étendre awt.Canvas).

var smileyCanvas = new JavaAdapter(awt.Canvas, { 
    paint: function (g) { 
     var size = this.getSize(); 
     var d = Math.min(size.width, size.height); 
     var ed = d/20; 
     var x = (size.width - d)/2; 
     var y = (size.height - d)/2; 
     // draw head (color already set to foreground) 
     g.fillOval(x, y, d, d); 
     g.setColor(awt.Color.black); 
     g.drawOval(x, y, d, d); 
     // draw eyes 
     g.fillOval(x+d/3-(ed/2), y+d/3-(ed/2), ed, ed); 
     g.fillOval(x+(2*(d/3))-(ed/2), y+d/3-(ed/2), ed, ed); 
     //draw mouth 
     g.drawArc(x+d/4, y+2*(d/5), d/2, d/3, 0, -180); 
    } 
}); 

Il y a more information on MDN, y compris une brève explication et appelant exemple de syntaxe.

+0

Le lien MDN est mort – planty182

0

E.g. début d'un fil dans Rhino:

function startThread(funcOfThread) { 
    var someClass = { run: funcOfThread }; // Rhino syntax for new class with overwritten method 
    var r = new java.lang.Runnable(someClass); 
    var t = new java.lang.Thread(r); 
    t.start(); 
} 

function UDP_Client() { 
    while (1) 
     java.lang.Thread.sleep(100); 
} 

startThread(UDP_Client);