设置了静态变量,但无法获取-加载类的问题(可能吗?)

这对我来说很奇怪:


1)我有一堂课


public class Data {

    private static String name;


    public static String getName() {

        return name;

    }


    public static void setName (String n){

        Data.name = n;

    }

}

在我的服务器(WAS liberty中的J2EE应用程序)启动期间正确设置了此类变量名-我想在整个服务器生命周期中缓存此数据。


2),但是当我点击一个URL并最终调用一个执行getter的代码时:


Data.getName(); // this returns null??

谁能想到一个可能的原因?也无法调试,我很沮丧。


为了进一步说明我的问题,让我展示一下我的项目结构:


耳朵


普通公猪


战争1战争2


我的Data.java在CommonJar中。在服务器启动期间,通过在web.xml中注册的侦听器触发,此Data.java在WAR1中进行了初始化,从这里我看到它已设置,并且我看到了使用Data.getName()的非null值。-这是我的我的原始帖子中的第1步。


然后在WAR2中有一个宁静的HelloWorld服务。当我调用此HelloWorld服务时,我看到Data.getName()返回null。-这是我原始帖子中的第2步。甚至不要想像简单错误的语法类型之类的东西,因为事实并非如此。


我的理论是:看来Data.java是在第1步中由WAR1中的类加载器加载的,然后在我的第2步中由WAR 2加载的,而第2步是由空的Data类加载的。


为了验证该理论是否正确,我将Data.java初始化步骤移至WAR2中(再次看到它已设置,并使用Data.getName()看到了非null值),不同之处在于,当我调用进入此HelloWorld服务后,我看到Data.getName()返回了预期的非null值。我称此步骤为我的疑难解答突破,因为这似乎表明我的理论是正确的。(但是我无法通过在真正的问题修复程序中移动代码来解决问题)


然后,问题是如何修复以及如何直观地查看哪个类加载器以及何时加载哪个类?同样基于WAS Liberty文档,默认的类加载器将是parentsfirst,这意味着Data.java应该由父级(在这种情况下为EAR)加载,因此我不应该将问题放在首位。


任何人,请指导如何进一步发现并解决该问题?谢谢。


墨色风雨
浏览 272回答 2
2回答

叮当猫咪

您的getName()函数声明为没有返回类型,但是尝试返回字符串。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java