2015-01-31 5 views
2

저는 자바를 배우며 지난 몇 주 동안 연습을 위해 여러 클래스를 만들었습니다. 내 머리 속에는 내가 만든 모든 클래스의 목록을보고 원하는 클래스를 선택하여 실행할 수있는 클래스를 만드는 것이 좋습니다.자바에서 런타임에 변수에 이름이있는 클래스를 실행하십시오.

의 I 해냈어 방식과 지금까지 내가 갔을 :

  • 가 나는 HashMap<Integer,String>에 SimpleFileVisitor 나의 모든 클래스의 목록을 참조하십시오.
  • 이 목록에서 사용자는 클래스와 연결된 번호를 입력하여 파일을 선택할 수 있습니다.
  • 문자열이 클래스 이름과 함께 반환됩니다.

여기에 문제가 있습니다.

예를 들어 Clock.class이라는 문자열로 끝납니다. 이걸 실행하고 싶습니다. 방법?

내가 원하는 클래스를 알고 있다고 가정 해 봅시다. 간단하게 사용할 수 있습니다 Clock.main() 여기서 문제는 런타임까지 실행될 클래스를 알 수 없으므로 잃어 버릴 수 있다는 것입니다.

나는 Reflection API를 가지고 놀고있다. Clock.class의 객체를 인스턴스화 할 수 있지만 아무 일도 발생하지 않습니다.

어쩌면 내가 반사를 전혀 사용하지 않아야합니까? 어쩌면 간단한 방법이 있을까요?

이것은 내가 갇혀있는 곳입니다. 누군가가 나를 계몽 할 수 있기를 바랍니다. :)

+0

클래스 경로에 클래스 파일이 있습니까? –

+0

하단의 메모는 부적합합니다. 이 사이트의 사람들은 그러한 메모를 추가 할 필요가 없음을 * 판단합니다. 그것 외에 당신의 질문은 아주 잘 보입니다. 나는'ProcessBuilder'를 사용하여'java'를 실행하고'.class' 파일의 경로를 전달하여 실행하도록 권한다. –

+0

인스턴스화가 가능하다면 필요한 모든 것을 이미 가지고 있습니다. 정적 메서드를 실행하려면 클래스에서 호출합니다. 인스턴스 메소드를 실행하려면 동일하지만 인스턴스에서 수행하십시오. 인터페이스를 구현하는 인스턴스를 사용하고 인터페이스 메소드를 직접 호출하는 것과 같이 약간 다른 접근법을 고려할 수 있습니다. –

답변

1

귀하의 클래스 파일 경로가 SimpleFileVisitor을 경유하여 통과하는 경로가 있습니다. 파일 이름과 경로를 맵에 저장하십시오. 사용자가 선택하면 Clock.class에 해당하는 경로를 가져오고 다른 Java 프로세스를 시작합니다.

간단하게 할

Process process = Runtime.getRuntime().exec("/pathToJDK/bin/java", pathToClassFile); 

당신은 같은 I/O 및 오류 스트림을 주위 재생할 수 있습니다 -

InputStream inputStream= process .getErrorStream(); 
//print this stream 
+0

'/ pathToJDK/bin/java'이어야합니다.Btw를 사용하면 JVM을 올바르게 호출하기 위해 런타임에 클래스 경로 및 JVM 위치를 결정하는 것이 편리 할 수 ​​있습니다. –

+0

예, 오타를 유감스럽게 생각합니다. JVM 위치를 찾는 데는 다음 코드를 사용할 수 있습니다. [Java 프로그램에서 프로그래밍 방식으로 Java 홈 찾기] (http://opensourceforgeeks.blogspot.in/2014/11/finding-java-home-programatically-from.html)는 나도 비슷한 문제에 빠져있다. –

+0

JVM이 일반적으로 충분하므로 다른 JDK (자체 JVM을 제공함)를 찾을 필요가 없으므로이 방법을 사용할 필요가 없다고 생각합니다. 'java.home'과'java.class.path' 시스템 속성을 사용하기 만하면됩니다. –

2

당신은 클래스의 주요 메소드를 호출하는 반사를 사용할 수 있습니다

Class<?> cls = Class.forName("package.path.yourClassName"); 
Method m = cls.getMethod("main", String[].class); //mandatory signature for main() 
String[] params = null; // any params on the call? 
m.invoke(null, (Object) params); 

참고 : invoke()의 첫 번째 매개 변수는 호출을 호출하려는 인스턴스입니다. 그러나 정적 메서드는 인스턴스에 속하지 않으므로 null을 사용하십시오.

+0

고마워요! 이것이 제가하려고했던 것입니다. 그것은 완벽하게 작동합니다. 정말 고맙습니다 :) – oneteen

관련 문제