我有一些疯狂的任务,听起来像是不可能的任务。我需要通过一堆方法传递一些数据,我无法修改(只能修改最后一个)。例如:
SomeData someData; //not passed in method1
obj1.method1(...);
这里是obj1类代码
obj1 {
someReturnClass method1(...) {
...
obj2.method2(...);
...
}
}
obj2和method2在进入objN.methodM()之前调用了一些方法。它甚至可以在单独的线程中运行(因此,ThreadLocal也无济于事)。我需要访问methodM中的someData,它不作为参数传递给这个堆栈。
我有一些概念来通过异常和双重运行方法M,但它看起来很难看。
您有什么想法,如何将someData传递给methodM()?
答案 0 :(得分:1)
如果你不能以任何其他方式走私访问 - 例如通过将SomeData
的引用添加到 通过调用堆栈传递的其他对象中 - 那么您最终将不得不使用全局变量。这当然是一个糟糕的设计,但鉴于你的约束,没有别的可能。
你在评论中提到你可能有几次调用你的方法“活跃”(它是递归的,还是你有多个线程?)在这种情况下,你需要有一个全局集合,并有一些推断集合中哪个元素要从 通过调用堆栈传递的数据中进行选择的方法。
答案 1 :(得分:0)
我知道你需要在方法激活中访问一个局部变量,这个方法是你无法改变的,但是你知道它在堆栈中的位置较低。
这里显而易见的是使用Java调试架构:http://docs.oracle.com/javase/7/docs/technotes/guides/jpda/index.html
这将允许您检查所有线程的堆栈。
答案 2 :(得分:0)
最后,我找到了解决方案:
创建JAAS主题
Subject subject = new Subject();
将数据放在主题的主体或凭据中的某处:
subject.getPublicCredentials().add(new String("Trololo"));
在任何您需要的地方获取此主题及其数据(即使在另一个线程中也能正常工作):
Subject subject = Subject.getSubject(AccessController.getContext());
System.out.println(subject.getPublicCredentials());
仅在一种情况下不起作用:线程在创建主题之前启动。