【问题标题】:How to protect method signature in java called from other language (javascript)如何保护从其他语言调用的java中的方法签名(javascript)
【发布时间】:2013-02-21 07:13:51
【问题描述】:

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

【问题讨论】:

  • 在 JAVA 中更改您的签名无法重构您的 JavaScript 代码。因为 JavaScript 只是调用 Java 方法(作为服务)。您需要手动更改它们。想象一下 Java 方法是由第三方创建的,而您正试图使用​​ JavaScript 来使用他们的服务。所以如果他们改变了他们的签名,你需要修改。或者您可以做什么,如果 JavaScript 需要/或使用之前的方法,则重载方法
  • 我知道改变java不会改变javascript。当有人试图更改 java 中的方法(类)签名(例如,与注释或其他地方定义的某些签名相比)时,我想要一些会显示编译错误的东西,这样他就会看到有问题。现在我们知道当我们运行 javascript 函数时出了点问题。在java中一切正常。

标签: java javascript communication


【解决方案1】:

问题是如何对抗它。

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

【讨论】:

  • 我考虑了一下,如果没有人知道更好的方法,我们可能会使用它。
【解决方案2】:

我认为您的问题有几个解决方案(变通方法)。

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
}

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

}

如果这有帮助,请告诉我。

【讨论】:

  • 第一个解决方法在我们的项目中会很耗时,而且我不喜欢 if-else 序列。第二种选择也不好。您编写的方法只能由 cmets 进行重构,因此如果有人看不到它,他无论如何都会更改它们。目前,我认为自动测试是最好的解决方案。
  • 我也不喜欢第二个选项。但是,如果您仔细注意到它,所有可以从 javascript 调用的方法都以 noRefractor 开头。因此,在折射之前将方法名称。但是,我并不为这种解决方案感到自豪。我根本不会为解决方案辩护。耗时,如果您的意思是执行耗时,请解释如何。我同意 if else 序列是一种不好的编码方式。我会想一个替代方案(如果可能的话)来避免,否则。
猜你喜欢
  • 2011-03-28
  • 2014-11-07
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
  • 2016-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多