2012-11-02 45 views
0

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

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

这里是OBJ1类代码

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

OBJ2和method2调用一些方法,他们得到objN.methodM前()。它甚至可以在单独的线程中运行(所以,ThreadLocal不会帮助)。我需要访问methodM中的someData,它不会通过此堆栈作为参数传递。

我有一些概念可以通过异常和双重运行methodM来获得它,但它看起来很丑。

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

+1

要清楚:你的意思是你需要访问一个方法激活的局部变量,一个你不能改变的方法,但是你知道存在的方法在栈上较低? – Marcin

+1

基本上,你需要某种(相对)静态数据。这可能是一个“单例”,一些常见的可寻址对象中的实例字段,线程局部变量或少数其他事物。 –

+0

是的,我想过一些单身人士。但是以我的方法结束的几个这样的堆栈可能会同时运行。 – Oroboros102

回答

0

最后,我找到了解决办法:

创建JAAS主题在主题的校长或凭据

Subject subject = new Subject(); 

数据放在什么地方:

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

得到这个主题,它的数据你需要的地方(即使在另一个线程中工作):

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

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

0

我知道你需要访问一个方法激活的局部变量,一个你不能改变的方法,但是你知道这个方法在栈上的位置较低。

这里明显的一点就是与Java调试架构的工作:http://docs.oracle.com/javase/7/docs/technotes/guides/jpda/index.html

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

+0

对于JPDA jvm需要在调试模式下运行。这对我的情况来说是个大问题。 – Oroboros102

+2

@ Oroboros102所以,你不能修改代码,你不能在调试模式下运行它?在这种情况下,你不能这样做。 – Marcin

+0

全局变量呢?他们不是非法的,只是不道德:) –

1

如果您不能以其他方式走私 - 例如通过将SomeData的引用添加到的某个其他对象中,并通过调用堆栈 - 那么您最终必须使用全局变量。这当然是一个糟糕的设计,但考虑到你的限制,没有别的可能。

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

+0

在我奇怪的情况下,这种方法最适合。感谢这个简单的想法,我甚至都没有想过。 – Oroboros102

+0

@ Oroboros102:很高兴为你工作:) –