在 Nashorn Java 脚本中覆盖 Java class 的方法
Overriding a method of a Java class in Nashorn JavaScript
下面的Java方法创建一个Java具有固定用户名和密码的邮件密码验证器:
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 Java脚本函数,它的作用完全相同,但我不知道如何覆盖 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() {
创建一个匿名内部 class!换句话说:您正在隐式创建一个新的 class,并实例化该 class 的一个对象。您的新 class 正在扩展它派生的 class,因此您可以覆盖 { block } 中的方法。
简单的解决方案是显式:创建一个"real" java class 将用户名、密码作为构造函数参数,并像您在第一个示例中那样使用它们。然后简单地让 java 脚本代码实例化 that class 并传递所需的参数。
不要模仿实施细节,而是专注于需要完成的工作(创建具有特定行为的 class 的对象)!
下面的Java方法创建一个Java具有固定用户名和密码的邮件密码验证器:
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 Java脚本函数,它的作用完全相同,但我不知道如何覆盖 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() {
创建一个匿名内部 class!换句话说:您正在隐式创建一个新的 class,并实例化该 class 的一个对象。您的新 class 正在扩展它派生的 class,因此您可以覆盖 { block } 中的方法。
简单的解决方案是显式:创建一个"real" java class 将用户名、密码作为构造函数参数,并像您在第一个示例中那样使用它们。然后简单地让 java 脚本代码实例化 that class 并传递所需的参数。
不要模仿实施细节,而是专注于需要完成的工作(创建具有特定行为的 class 的对象)!