通过调用堆栈传递数据而无需修改方法

时间:2012-11-02 14:58:52

标签: java algorithm

我有一些疯狂的任务,听起来像是不可能的任务。我需要通过一堆方法传递一些数据,我无法修改(只能修改最后一个)。例如:

SomeData someData; //not passed in method1
obj1.method1(...);

这里是obj1类代码

obj1 {
    someReturnClass method1(...) {
        ...
        obj2.method2(...);
        ...
    }
}

obj2和method2在进入objN.methodM()之前调用了一些方法。它甚至可以在单独的线程中运行(因此,ThreadLocal也无济于事)。我需要访问methodM中的someData,它不作为参数传递给这个堆栈。

我有一些概念来通过异常和双重运行方法M,但它看起来很难看。

您有什么想法,如何将someData传递给methodM()?

3 个答案:

答案 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());

仅在一种情况下不起作用:线程在创建主题之前启动。