在我的网络应用程序中,位于名为“A”的jar中的静态变量值会在耳边发生变化。这个新改变的价值是可见的,并保持不变。但是,只要在名为“B”的另一个jar中访问该variablel,更新的值就不可用,并且第一个初始化值仅可用。我使用JBoss和jar都在tomcat-sar文件夹中。 例如:
//默认Ajar的静态变量状态;
Ajar.Aclass.staticVariableA = "initializedValue";
inside my utility classes in ear, Ajar.Aclass.staticVariableA = "NewValue";
//然后,当位于战争中的Bjar现在也可以访问Ajar的静态变量时,
System.out.println("value in B jar : " + Ajar.Aclass.staticVariableA );
//这会在B jar中打印值:initializedValue
根据我的意思,A.jar的值在耳朵上下文中是有效的,因为它在耳内被初始化。 B.jar有自己的上下文,每当调用A.jar中的变量时,返回这些变量的初始值。
有没有办法解决这个问题?
答案 0 :(得分:1)
您可以使用跨上下文servletContext属性作为直接进场
但要回答你的问题,因为你已经使用静态变量进步了
警告:根据JAVA的官方文档,应谨慎使用反射,这样您就不会操纵无法访问的对象
将以下crossContext =“true”放在TOMCAT_HOME \ conf \ context.xml
中<Context crossContext="true">
您必须通过ServletContext和ClassLoader Methodology
加载ClassServletContext context = request.getSession().getServletContext();
ServletContext othercontext = context.getContext("/otherwarrooturl");
现在你有了上下文和其他上下文,让我们假设目标类是com.debora.MyClass
我们将使用其他上下文
加载该类try {
Class myclass = othercontext.loadClass("com.debora.MyClass");
Field[] fields = myclass.getDeclaredFields();
//....your reflection program to fetch the static value...
//....or using method invoke...
}catch (Exception e) {
e.printStackTrace();
} finally {
//your cleanup code
}