如果我在tomcat上运行了两个java应用程序。申请A和B. 我在Application A中有一个带有静态变量的公共类,然后应用程序B可以访问它。如果不是那么为什么?
我在接受采访时被问到这个问题。我说它无法访问。但我不知道原因?
任何人都可以帮助解决正确答案。
答案 0 :(得分:4)
因为每个应用程序都有自己的类加载器,但JVM是相同的。 有关类加载器的更多信息,请参阅:What is a Java ClassLoader?
答案 1 :(得分:1)
每个应用程序war都有一个单独的类加载器,所以不,它们不能访问彼此的方法。
但是,这可以使用RMI或某些HTTP Web服务来完成。
答案 2 :(得分:0)
因为每个WebApp都已分配给自己的类加载器(Tomcat系统)。
您的确切问题,关于static
:
关键是ClassLoader的结构。一个JVM中的两个ClassLoader完全可以加载一个类,因此包含静态字段的独立,独立副本。
喜欢阅读:Classloader behaviour on Tomcat with multiple applications
答案 3 :(得分:0)
让我以最简单的方式表达。
Qusetion:如何访问静态变量? 答案:肯定是使用了班级名称。
我们有class
如下:
package com.package1;
public ClassA {
public static String GLOBAL_VARIABLE= "TEST";
}
问题:JVM如何看待ClassA。 答案:它看作ClassLoaderForA.com.package1.ClassA
假设使用Application1的类加载器加载它
现在,对于第二个应用程序的类加载器,ClassA
不存在。它找不到它。那么如何从ClassA
答案 4 :(得分:-2)
这取决于。在我看来,问题不够明确,不能给出答案/答案。
如果应用程序以某种方式暴露了变量,那么其他应用程序自然会要求获取该值。但这不太可能是问题的目标。但请牢记这一点。在采访中,我发现证明你能够批判性地思考并开箱即用总是好的。
我想他们想知道你是否已经掌握了静态变量和ClassLoader
的概念。 Java应用程序是动态链接的,这意味着在运行时,ClassLoader
(取决于应用程序)将执行链接,加载所有库或委派加载。静态变量由类引用。如果您尝试访问静态变量,类“ClassLoader
将尝试查找并加载该类。由于每个应用程序都有自己的ClassLoader
,因此每个应用程序都有自己的一组变量。
这与旧语言中的地址空间分离原则没有什么不同。应用程序在单独的地址空间中运行,即使它由同一台计算机托管。因此,两个并行运行的应用程序不能简单地解决另一个应用程序的地址空间中的变量,因为它会违反由多个监视程序强制执行的约束。但要注意,地址空间可以明确共享。