gpt4 book ai didi

当不在 Web 服务器中运行时,库中的 Java 重载方法失败

转载 作者:行者123 更新时间:2023-12-03 23:00:35 24 4
gpt4 key购买 nike

我正在尝试编写一个小型库,它既可以在标准 Java 应用程序中使用,也可以作为 servlet 的一部分。

我定义了几个重载方法如下:

// imports etc.

public ExampleLibrary {

/**
* This one is meant to be used by a J2SE app
*/
public String processData(Map headers) throws MyException {
// process
// return result
}

/**
* This one is meant to be used by a servlet
*/
public String processData(HttpServletRequest request) throws MyException {
// extract headers from request
// process
// return result
}


// other methods.....
}

这在用作 Servlet 的一部分时效果很好,但是当用作 J2SE 应用程序的一部分时它起作用。

在我的 J2SE 应用程序中,我执行了以下操作:

ExampleLibrary example = ExampleLibrary.getInstance();

Map headers = new HashMap();
headers.put("someheader1", "someheaderval1");
headers.put("someheader2", "someheaderval2");

String res = example.processData(headers);

我在编译时得到这个:“无法访问 javax.servlet.http.HttpServletRequest 类文件,因为找不到 javax.servlet.http.HttpServletRequest”

我希望编译器选择正确的 processData() 方法并忽略另一个方法,因为显然 J2SE 应用程序中没有 Servlet 类文件。有什么解决办法吗?

最佳答案

您可以通过在编译时将 servlet.jar 包含在您的类路径中来解决您的问题。

这里有一个问题:

如果您的库的用户调用这两个方法之一,编译器需要确定实际调用这两个方法中的哪一个。如果您有不同的方法名称,一切都很好,编译器不需要需要访问 HttpServletRequest。但是,如果您有相同的名称,编译器需要访问 HttpServletRequest 以确定这两种方法中哪一种最适合调用和参数。

因此,您的库的用户不需要需要servlet.jar运行他的程序,但是如果您使用方法重载,他将需要它来编译他的程序。

这是一个说明这一点的虚拟示例:

虚拟测试第三方库:

首先,让我们创建一个虚拟的第三方库 jar(并丢弃源代码):

# libtest$ mkdir thirdpartylib
# libtest$ cat -> thirdpartylib/ThirdPartyClass.java
package thirdpartylib;

public class ThirdPartyClass {
public void thirdPartyMethod() {
System.out.println("Third party method");
}
}
# libtest$ javac thirdpartylib/ThirdPartyClass.java
# libtest$ jar cf thirdpartylib.jar thirdpartylib/ThirdPartyClass.class
# libtest$ rm -rf thirdpartylib

虚拟测试你的库:

# libtest$ mkdir mylib
# libtest$ cat -> mylib/LibClass.java
package mylib;
import thirdpartylib.ThirdPartyClass;

public class LibClass {

public void method(String str) {
System.out.println("method 1");
}

// Overloaded method taking third party class as argument.
public void method(ThirdPartyClass tpc) {
tpc.thirdPartyMethod();
}
}
# libtest$ javac -cp .:thirdpartylib.jar mylib/LibClass.java
# libtest$ jar cf mylib.jar mylib/LibClass.class
# libtest$ rm -rf mylib

测试在没有 thirdpartylib.jar

的情况下使用您的库
# libtest$ cat -> LibUser.java
import mylib.LibClass;

public class LibUser {
public static void main(String[] args) {
new LibClass().method("Hej");
}
}
# libtest$ javac -cp .:mylib.jar LibUser.java
LibUser.java:5: cannot access thirdpartylib.ThirdPartyClass
class file for thirdpartylib.ThirdPartyClass not found
new LibClass().method("Hej");
^
1 error
# libtest$ javac -cp .:mylib.jar:thirdpartylib.jar LibUser.java
# libtest$ java -cp .:mylib.jar LibUser
method 1

关于当不在 Web 服务器中运行时,库中的 Java 重载方法失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7257496/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com