在我的Web应用程序ear中,在ear中更改了位于名为“ A”的罐中的静态变量值。新更改的值是可见的,并保持原样。但是,只要在另一个名为“ B”的jar中访问该变量1,更新的值就不可用,而第一个初始化的值才可用。我使用JBoss,而jars在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中的变量,就会返回这些变量的初始值。
有办法解决吗?
最佳答案
您可以使用跨上下文servletContext属性作为直接方法
但是要回答您的问题,因为您已经在使用静态变量了
警告:根据JAVA的官方文档,应谨慎使用反射,以免操作无法访问的对象
将以下crossContext =“ true”放入TOMCAT_HOME \ conf \ context.xml中
<Context crossContext="true">
而且您必须通过ServletContext和ClassLoader方法来加载类
ServletContext 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
}