2011-11-26 1 views
2

JVM에서 실행중인 임의의 코드에서 현재 JVM을 시작하는 데 사용되는 기본 클래스의 이름을 찾는 방법이 있습니까?Java 코드에서 주 클래스의 이름을 찾을 수있는 편리한 방법

임의로, 코드가 주 스레드에서 반드시 실행되고 있지 않거나 주 스레드가 호출되기 전에 주 스레드에서 실행 중일 수 있습니다 (예 : 사용자 제공 java.system.classloader의 코드, main을로드하는 데 사용되기 때문에 main보다 먼저 실행 됨) - 호출 스택을 검사 할 수 없습니다.

+0

주 클래스의 주 메서드가 먼저 호출됩니다. (http://java.sun.com/docs/books/jls/third_edition/html/execution.html#12.1을 참조하십시오.) 그래서 메인이 호출되기 전에 "메인 스레드에서 실행 중일 수 있습니다" . 나는이 문장이 "정적 이니셜 라이저"또는 "Thread # run()"을 언급한다고 생각한다. – cocoatomo

+0

@cocoatomo : 나는 뭔가를 놓치고 있습니다. 그 링크가 원래의 포스터의 질문에 대한 해결책을 제시합니까? 나는 그것을 검토했지만, 어떻게 든 그것을 놓쳤다. –

+0

@ Hovercraft Eels의 가득 차있는 : 미안, 나는 나의 코멘트를 완료하기 전에 돌아 오는 열쇠를 밀기를 잘못했다. BeeOnRope의 의도를 이해하고 싶습니다. 그래서 BeeOnRope가 만나기를 희망합니다. – cocoatomo

답변

8

이것은 내가 얻을 수있는 가장 가까운 것이고 여기에서 가져올 수 있습니다. 이식성이 정말 보장 할 수는 없으며 어떤 메소드가 다른 클래스의 main 메소드를 호출하는 경우 작동하지 않을 수 있습니다. 더 깨끗한 솔루션

import java.util.Map.Entry; 

public class TestMain { 

    /** 
    * @param args 
    * @throws ClassNotFoundException 
    */ 
    public static void main(String[] args) throws ClassNotFoundException { 
     System.out.println(findMainClass()); 
    } 

    public static String findMainClass() throws ClassNotFoundException{ 
     for (Entry<Thread, StackTraceElement[]> entry : Thread.getAllStackTraces().entrySet()) { 
      Thread thread = entry.getKey(); 
      if (thread.getThreadGroup() != null && thread.getThreadGroup().getName().equals("main")) { 
       for (StackTraceElement stackTraceElement : entry.getValue()) { 
        if (stackTraceElement.getMethodName().equals("main")) { 

         try { 
          Class<?> c = Class.forName(stackTraceElement.getClassName()); 
          Class[] argTypes = new Class[] { String[].class }; 
          //This will throw NoSuchMethodException in case of fake main methods 
          c.getDeclaredMethod("main", argTypes); 
          return stackTraceElement.getClassName(); 
         } catch (NoSuchMethodException e) { 
          e.printStackTrace(); 
         } 
        } 
       } 
      } 
     } 
     return null; 
    } 
} 
+0

고마워, 나는이 방법을 알고 있었지만 불행히도 main이 들어있는 클래스가로드되기 전에는 작동해야하기 때문에 나에게 도움이되지 않는다. (classloaders에 대한 질문에 내 의견이 추가되었다.) – BeeOnRope

+0

어쨌든 이것을 받아들이는 것은 옳은 일을하기 때문이며, 내가 주 수업을 기초로해야 할 일을 연기하기를 원한다면 사용할 수 있습니다. – BeeOnRope

+0

BTW, 오탐 (false positive)을 피하려는 경우 main이라고하는 클래스를 살펴보고 그것이 예상되는 JDK 특정 클래스인지 확인할 수 있다고 생각합니다. 특정 JDK 또는 JDK에 대한 의존성을 초래할지라도. – BeeOnRope

관련 문제