Java中如何从ClassB获取ClassA静态变量jobID的最新运行值?
问题:ClassB无法获取ClassA更新后的静态jobID值
场景:通过bat调用ANT执行XML构建文件,依次触发ClassA的doSomething()和ClassB的doSomethingElse(),期望ClassB拿到ClassA更新后的jobID="1234",但实际拿到的是初始值"initial value"。
代码示例
ClassA
public class ClassA { private static String jobID = "initial value"; public void doSomething() { jobID = "1234"; logger.info("Class A running now: Job ID current value: " + jobID); } public static String getJobID() { return jobID; } }
ClassB
public class ClassB { private static String jobID = ""; public void doSomethingElse() { jobID = ClassA.getJobID(); logger.info("Class B running now: Job ID retrieved from Class A is: " + jobID); } }
实际输出
Class A running now: Job ID current value: 1234 Class B running now: Job ID retrieved from Class A is: initial value
问题根源
ANT的<java>任务默认会为每个任务启动独立的JVM进程。ClassA在第一个JVM里修改了静态变量jobID,但ClassB运行在第二个全新的JVM中,这个JVM里的ClassA类是重新加载的,静态变量还是初始值,所以拿不到更新后的值。
解决办法
方法1:让ClassA和ClassB在同一个JVM中执行
写一个统一的入口类,在同一个main方法里先后调用两个类的方法,然后ANT只调用这个入口类:
public class MainEntry { public static void main(String[] args) { ClassA a = new ClassA(); a.doSomething(); ClassB b = new ClassB(); b.doSomethingElse(); } }
修改ANT的XML配置,只保留一个<java>任务:
<target name="run-jobs"> <java classname="MainEntry" fork="false"> <classpath> <pathelement location="bin"/> </classpath> </java> </target>
注意设置fork="false"(默认不指定fork或设为false时,会使用ANT本身的JVM执行,不会新启进程)。
方法2:将jobID持久化到外部存储
如果必须分开执行两个类,可以把jobID写到外部存储,让ClassB读取:
- ClassA执行完把
jobID写入临时文件、ANT属性或系统环境变量; - ClassB读取这个外部值。
比如用ANT属性传递的方式:
<target name="run-classA"> <java classname="ClassA" fork="true" outputproperty="job.id"> <classpath> <pathelement location="bin"/> </classpath> </java> <!-- 需确保ClassA的doSomething最后单独一行输出jobID的值,比如"1234" --> </target> <target name="run-classB" depends="run-classA"> <java classname="ClassB" fork="true"> <classpath> <pathelement location="bin"/> </classpath> <arg value="${job.id}"/> <!-- 把ANT属性作为参数传给ClassB --> </java> </target>
修改ClassB,从命令行参数获取jobID:
public class ClassB { private static String jobID = ""; public void doSomethingElse(String id) { jobID = id; logger.info("Class B running now: Job ID retrieved is: " + jobID); } public static void main(String[] args) { ClassB b = new ClassB(); b.doSomethingElse(args[0]); } }
内容的提问来源于stack exchange,提问作者AutoTester999
相关产品推荐
相关产品推荐

