0

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

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

这是obj1类代码

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

obj2 和 method2 在到达 objN.methodM() 之前调用了更多方法。它甚至可以在单独的线程中运行(因此,ThreadLocal 无济于事)。我需要访问methodM内部的someData,它没有通过这个堆栈作为参数传递。

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

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

4

3 回答 3

1

如果您不能以任何其他方式偷运访问——例如,通过将引用添加SomeData到通过调用堆栈传递的其他对象中——那么您最终将不得不使用全局变量。这当然是一个糟糕的设计,但考虑到您的限制,其他任何事情都是不可能的。

您在评论中提到您可能对您的方法“活动”进行了多次调用(它是递归的,还是您有多个线程?)在这种情况下,您将需要有一个全局集合,并有一些推断的方法从通过调用堆栈传递的数据选择集合的哪个元素。

于 2012-11-02T15:44:57.140 回答
0

我知道您需要访问方法激活中的局部变量,该方法您无法更改,但您知道该方法在堆栈中的位置较低。

这里显而易见的是使用 Java 调试架构:http ://docs.oracle.com/javase/7/docs/technotes/guides/jpda/index.html

这将允许您检查所有线程的堆栈。

于 2012-11-02T15:03:20.643 回答
0

最后,我找到了解决方案:

创建 JAAS 主题

Subject subject = new Subject();

将数据放在主体的主体或凭据中的某个位置:

subject.getPublicCredentials().add(new String("Trololo"));

在您需要的任何地方获取此主题及其数据(即使在另一个线程中也可以使用):

Subject subject = Subject.getSubject(AccessController.getContext());
System.out.println(subject.getPublicCredentials());

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

于 2012-11-02T15:51:58.480 回答