2012-11-02 3 views
0

미션이 불가능합니다. 임무가 불가능한 것 같습니다. 메서드의 스택을 통해 일부 데이터를 전달해야합니다.이 메서드는 수정할 수 없습니다 (마지막 하나만 수정할 수 있음). 예 : 여기메서드 수정없이 호출 스택을 통해 데이터 전달

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

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

obj2보다 및 방법 2가 objN.methodM에 도착하기 전에, 좀 더 메소드를 호출()으로 obj1 클래스 코드를입니다. 별도의 스레드로도 실행할 수 있습니다 (ThreadLocal이 도움이되지 않습니다). 이 스택을 매개 변수로 전달하지 않는 methodM 내부의 someData에 액세스해야합니다.

나는 예외와 이중 실행 방법을 통해 그것을 얻기 위해 몇 가지 개념을 가지고 있지만,보기 흉하게 보입니다.

someData를 methodM()에 전달하는 방법에 대한 아이디어가 있습니까?

+1

명확해야 : 메서드 활성화 내부의 로컬 변수, 변경할 수없는 메서드 중 로컬 변수에 액세스해야한다는 것을 의미합니까? 스택에서 더 낮은 위치에 있다는 것을 알고 있습니까? – Marcin

+1

기본적으로 (상대적으로) 정적 데이터가 필요합니다. 이것은 "싱글 톤 (singleton)", 일반적으로 주소 지정 가능한 객체의 인스턴스 필드, 스레드 로컬 변수 또는 다른 것들을 포함 할 수 있습니다. –

+0

네, 싱글 톤에 대해서 생각했습니다. 그러나 내 방법으로 끝나는 여러 스택이 동시에 실행될 수 있습니다. – Oroboros102

답변

0

마지막으로, 나는 발견 솔루션 :

주체의 원칙 또는 자격 증명

Subject subject = new Subject(); 

넣고 데이터 어딘가 JAAS 주제를 작성 :

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

(이 주제를 확인하고 당신이 필요로 어디서든 데이터의 다른 스레드에서도 작동 함) :

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

하나의 경우에만 작동합니다. 주제가 작성되기 전에 스레드가 시작되었습니다.

0

메서드 활성화 내에서 로컬 변수에 액세스해야한다는 것을 알고 있습니다. 변경할 수는 없지만 스택에서 더 낮은 위치에 있다는 것을 알고 있습니다.

여기에서 분명한 것은 자바 디버깅 아키텍처와 함께 작동하는 것입니다 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 : 다행 당신을 위해 :) –

관련 문제