当我需要使用带参数的构造函数时,如何使用Rhino对Java类进行子类化(扩展)?
我有一个如下所示的类-这是库的一部分,我根本无法更改它(如果可以,我只需重新编写它或用Java将其子类化) 我想使用Rhino从中创建一个Javascript对象(所以请不要评论Javascript与Java不同,我知道这一点),但要覆盖方法“aMethod” 所以在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
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...
}
}