如何保护java中从其他语言(javascript)调用的方法签名

如何保护java中从其他语言(javascript)调用的方法签名,java,javascript,communication,Java,Javascript,Communication,我有一个关于java与javascript结合的问题。在我们的应用程序中,我们有javascript中的gui构建和java中的服务器端构建。在javascript中,我们编写了我们想要从java中的classY调用methodX的代码。问题是java对javascript一无所知,所以当我们在java中更改某些内容时,可能会破坏javascript代码。即使eclipse中的普通重构选项也可以在不知情的情况下破坏javascript(更改方法名、删除参数、重命名DTO对象中的setter和ge

我有一个关于java与javascript结合的问题。在我们的应用程序中,我们有javascript中的gui构建和java中的服务器端构建。在javascript中,我们编写了我们想要从java中的classY调用methodX的代码。问题是java对javascript一无所知,所以当我们在java中更改某些内容时,可能会破坏javascript代码。即使eclipse中的普通重构选项也可以在不知情的情况下破坏javascript(更改方法名、删除参数、重命名DTO对象中的setter和getter)。问题是如何对抗它。我曾考虑用java编写一些注释,因此在更改方法签名后,您将出现编译错误(甚至有可能编写这种注释),但如果有某种工具可以为我这样做,我不想重新发明轮子。如果有任何帮助,我将不胜感激

问题是如何对抗它


最实际的解决方案可能是开发一组自动化测试(例如单元或系统测试),专门设计用于“练习”所有从Javascript调用Java API的情况(反之亦然)

我认为有两种解决方案(变通方法)可以解决您的问题

1) 使用方法映射某些字符串

public class JavascriptCallable {

private static final String jsIdentifierMethod1 = "method1";

private static final String jsIdentifierMethod2 = "method2";


/**
 * All requests from JS should be redirected to this method.
 * 
 * @param methodName Name of the method
 */
public void requestFromJavascript (String methodName) throws Exception {

    if (methodName.equals(jsIdentifierMethod1)){
        method1();
    } else if (methodName.equals(jsIdentifierMethod2)){
        method2();
    } else{
        throw new Exception("Method not supported");
    }

}

public void method1(){
    // Do something
}

public void method2() {
    // Do something
}
}

2) 具有适合js调用的单独方法。如果您使用反射来调用这些方法,这将很有帮助

public class JavascriptCallable {

/*----------------Methods to be called by js. Never refractor------------------*/

public void noRefractorMethod1() {
    method1();
}

public void noRefractorMethod2() {
    method2();
}

/*-------------------------------------------------------------------------------*/

/*---------Methods with business logic. Refractoring these will not mess your js-----------*/

public void method1() {
    // Business logic
}

public void method2() {
    // Business logic
}

/*-------------------------------------------------------------------------------*/
}


请告诉我这是否有帮助。

用JAVA更改签名无法重构JavaScript代码。因为JavaScript只是调用Java方法(作为服务)。您需要手动更改它们。假设Java方法是由第三方创建的,您正试图使用JavaScript使用它们的服务。因此,如果他们更改了签名,您需要修改。或者,如果javascript需要或使用前面的方法,请重载这些方法。我知道更改java不会更改javascript。我希望当有人试图更改java中的方法(类)签名(例如,与注释或其他地方定义的签名相比)时,能够显示编译错误,这样他就会发现有问题。现在我们知道在运行javascript函数时出现了一些问题。在java中,一切都很好。我想如果没有人知道更好的方法,我们可能会使用它。在我们的项目中,第一个解决方法会很耗时,我不喜欢if-else序列。第二个选择也不好。您编写的方法只有通过注释才能防止重构,因此如果有人看不到,他无论如何都会更改它们。目前,我认为自动测试是最好的解决方案。我也不喜欢第二种选择。然而,如果您仔细地注意到,所有符合从javascript调用条件的方法都以noRefractor开头。因此,在进行折射之前,必须先确定方法名称。然而,我对这种解决方案并不感到自豪。我根本不会为解决方案辩护。如果您的意思是执行需要时间,请解释如何执行。我同意if-else序列是一种糟糕的编码方式。我会想出一个替代方案(如果可能的话)来避免其他情况。