자바에서 stack info, argv[0]

jj의 이미지

안녕하세요?

Java에서 현재 stack의 정보를 알 수 있는지요?

method내부에서, 자신을 호출한 method를 알고 싶은 상황입니다.

단순한 reflection은 동적인 정보는 제공하지 않는것으로 보이는데...

또, argv[0]은 보통 어떻게들 쓰세요?

C에서라면

int main(...argc...argv...) {
   print("Usage: %s [options....]...", argv[0], ...)
}

아시겠지만, Java에서는 argv[0]이 없죠.

public class SomeUtil {
   public static void main(String[] args) {
       System.out.println("Usage: " + ??? + " ..."); // how???
   }
}

어떤 대안이 있을까요? 클래스 이름을 하드코딩하니, 가끔 클래스 이름 바뀔때가 있어서... 음... SomeUtil.class.getName()이 가장짧은건지?

유겸애비의 이미지

Thread.dumpStack(); 을 호출하세요. static method 입니다.
실행화일 이름은 java.exe 니까 별 의미가 없는거 같구요.
Main 클래스의 이름은 getClass().getName() 정도면 될거 같습니다만. 제가 의도를 잘못파악했을거 같군요.

jj의 이미지

behumble wrote:
Thread.dumpStack(); 을 호출하세요. static method 입니다.

음... stdout으로 그냥 출력해주는 method이군요. 자료구조를 리턴해주는 함수는 역시 없는건가요?

behumble wrote:

실행화일 이름은 java.exe 니까 별 의미가 없는거 같구요.
Main 클래스의 이름은 getClass().getName() 정도면 될거 같습니다만. 제가 의도를 잘못파악했을거 같군요.

그런데 getClass가 instance method라서요. 음... 답변 감사드립니다~

--
Life is short. damn short...

allinux의 이미지

public class Asdf
{
	public static String className = null;
	public Asdf()
	{
		className = this.getClass().getName();
	}
	public static void main(String[] args)
	{
		Asdf asdf = new Asdf();
		System.out.println(className);
	}
}

제가 문제를 맞게 이해한건가요?

fender의 이미지

음... 그냥 SomeUtil.class.getName()하면 됩니다. 호출자의 정보를 얻는 방법은 윗분께서 말씀하신 Thread.dumpStack()을 쓰시거나 프로그램적인 접근을 원할 경우 Exception를 하나 만들어서 getStackTrace()로 가져오면 됩니다.

근데 호출자의 클래스명을 원하시는 이유가 단지 사용법을 찍기 위한 거라면 좀 오버 같네요... 차라리 class.getName()으로 끊어 오는게 더 좋은 방법 같습니다.

(솔직히 저 정도면 리소스 같은데 하드코드해도 별 무리는 없습니다. 어차피 메인 클래스명이 수시로 바뀌는 프로젝트는 문제가 있는 프로젝트니까요...)

----------------------------
[서명] 그놈 한국 사용자 모임 - 그놈에 대한 모든 것! - 게시판, IRC, 위키, 갤러리 등등...

jj의 이미지

fender wrote:
음... 그냥 SomeUtil.class.getName()하면 됩니다. 호출자의 정보를 얻는 방법은 윗분께서 말씀하신 Thread.dumpStack()을 쓰시거나 프로그램적인 접근을 원할 경우 Exception를 하나 만들어서 getStackTrace()로 가져오면 됩니다.

현재의 workaround는 이렇게 사용하고 있긴한데, 문제는 getStackTrace가 1.4에서 추가된것이라... 아직1.3과의 호환성이 필요한상황입니다. 제 질문의 컨텍스트가 좀 모잘랐군요.

답변 감사합니다.

--
Life is short. damn short...

유겸애비의 이미지

1.4가 아니면 그 Stack Dump 찍은걸 Parsing 해서 쓰기도 하더군요. 자바월드에서 봤던거 같은데.. 구글하시면 나올거 같네요. 근데 아무래도 조잡하죠 :shock:

atie의 이미지

호출 method를 아는 방법은 아니지만, 스택에 있는 class context는 SecurityManager를 extends해서 알아 볼 수 있습니다. 결과값을 보시면 쉽게 이해를 하실거라 ....

public class Test {
	public Test() {
		try {
			Another.myMethod();
			Class c[] = DummySM.getStack();
			for (int i = 0; i < c.length; i++) {
				System.out.println(i + " " + c[i].getName());
			}
		} catch (Exception e) {
			System.out.println(e);
		}
	}
	public static void main(String args[]) {
		Test t = new Test();
	}
}
class DummySM extends SecurityManager {
	static public Class[] getStack() {
		return (new DummySM()).getClassContext();
	}
}
class Another {
	public static void myMethod() {
		System.out.println("I'm here");
	}
}

결과 :
I'm here
0 DummySM
1 Test
2 Test

참고로, SecurityManager는 abstract여서 인스턴스를 생성할 수 없고, System.getSecurityManager().getClassContext()는 protected입니다.

----
I paint objects as I think them, not as I see them.
atie's minipage

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.