当我需要使用带参数的构造函数时,如何使用Rhino对Java类进行子类化(扩展)?

当我需要使用带参数的构造函数时,如何使用Rhino对Java类进行子类化(扩展)?,java,javascript,rhino,Java,Javascript,Rhino,我有一个如下所示的类-这是库的一部分,我根本无法更改它(如果可以,我只需重新编写它或用Java将其子类化) 我想使用Rhino从中创建一个Javascript对象(所以请不要评论Javascript与Java不同,我知道这一点),但要覆盖方法“aMethod” 所以在Java中,我会这样做 public class MySpecialFirstClass extends FirstClass { public FirstClass(SecondClass arg) { s

我有一个如下所示的类-这是库的一部分,我根本无法更改它(如果可以,我只需重新编写它或用Java将其子类化)

我想使用Rhino从中创建一个Javascript对象(所以请不要评论Javascript与Java不同,我知道这一点),但要覆盖方法“aMethod”

所以在Java中,我会这样做

public class MySpecialFirstClass extends FirstClass
{
   public FirstClass(SecondClass arg)
   {
      super(arg);
   }
   public ThirdClass aMethod()
   {
      ThirdClass toReturn = super.aMethod();
      //My implementation goes here.
      return toReturn;
   }
   ...
}
但我似乎不能用Javascript来做。到目前为止我尝试过的事情

function js_FirstClass(arg)
{
   var temp = JavaAdaptor(FirstClass, 
      {
         '<init>': FirstClass,
         aMethod: function()
         {
            var toReturn = super.aMethod();
            //Do stuff
            return toReturn;
         }
      });
   return temp;
}

还有什么建议吗?

试试原型方法:

function newFirstClass(arg) {
    // Create hidden instance
    var inst = new FirstClass(arg);
    return {
        aMethod: function() {
            var result = inst.aMethod();
            // ... do stuff
            return result;
        }
        // forward every other call directly to inst
        otherMethod: function() {
            return inst.otherMethod();
        }
        // etc...
    }
}
因此,我们的想法是通过提供相同的方法(需要手动注册每个方法)并将调用传递给隐藏实例
inst
,创建一个JavaScript对象,其行为类似于
FirstClass
实例


无法使用
instanceof
,但仅在您需要时才有用。

谢谢您的回复-我没有想到这一点,但我认为这不合适。我得到错误“无法将[object]转换为full.path.to.FirstClass”,正如我所说:“不能使用
instanceof
”。您可能正在将实例传递给一些本机Java代码,这些代码需要实际的类型。这是Rhino AFAIK做不到的。您必须修改原始Java类(即使您“不能”这样做),或者至少在继承自
FirstClass
的类路径中添加一个新类。是的,我希望有一些很好的方法来覆盖该行为,但如果没有,我就放弃了。我只能通过Rhino访问JVM,向类路径添加类不是一个选项。顺便说一下,我认为问题是
instanceof
是错误的-我认为Rhino会立即抱怨我调用一个方法,因为它找不到javascript对象的签名方法。Rhino或javascript不关心签名。只考虑函数名(这就是为什么不能在JS中重载)。错误消息“Cannot convert”(无法转换)表示本机代码需要类型为
FirstClass
的实例,Rhino试图将参数强制为所需类型-这在duck类型中是不可能的。Rhino确实关心签名,它必须为给定的项选择最佳的签名。
var myClass = new FirstClass(secondClass);
myClass.aMethodOld = myClass.aMethod;
myClass.aMethod = function()
{
   var toReturn = aMethodOld();
   //Do stuff
   return toReturn;
}
function newFirstClass(arg) {
    // Create hidden instance
    var inst = new FirstClass(arg);
    return {
        aMethod: function() {
            var result = inst.aMethod();
            // ... do stuff
            return result;
        }
        // forward every other call directly to inst
        otherMethod: function() {
            return inst.otherMethod();
        }
        // etc...
    }
}