在Nashorn JavaScript中覆盖Java类的方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Nashorn JavaScript中覆盖Java类的方法相关的知识,希望对你有一定的参考价值。

以下Java方法使用固定的用户名和密码创建JavaMail密码验证器:

public static Authenticator createJavamailPasswordAuthenticator(String username,String password) {
    final String usernameTmp = username;
    final String passwordTmp = password;
    return new Authenticator() {
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(usernameTmp,passwordTmp);
        }
    };
}

我需要编写一个完全相同的Nashorn javascript函数,但我不知道如何覆盖Authenticator的getPasswordAuthentication Java方法。作为Nashorn新手,我尝试了以下内容

function createJavamailPasswordAuthenticator(username,password){
    var authenticator=new javax.mail.Authenticator();
    authenticator.getPasswordAuthentication=function(){
        return new javax.mail.PasswordAuthentication(username,password);
    }
    return authenticator;
}

......但那没用。

有人知道解决方案吗?

答案

这里:

return new Authenticator() {

创建一个匿名的内部类!换句话说:您正在隐式创建一个新类,并实例化该类的对象。您的新类正在扩展它派生自的类,因此您可以覆盖{block}中的方法。

简单的解决方案是明确说明:创建一个“真正的”java类,它接受用户名,密码作为构造函数参数,并像第一个示例中那样使用它们。然后只需让java脚本代码实例化该类并传递所需的参数。

不要模仿实现细节,而是关注需要完成的事情(创建具有特定行为的类的对象)!

以上是关于在Nashorn JavaScript中覆盖Java类的方法的主要内容,如果未能解决你的问题,请参考以下文章

java9新特性-20-Javascript引擎升级:Nashorn

Java8 Nashorn JavaScript引擎

Nashorn——在JDK 8中融合Java与JavaScript之力

JDK8系列之JavaScript引擎Nashorn

JDK8系列之JavaScript引擎Nashorn

JDK8系列之JavaScript引擎Nashorn