2011-11-05 1 views
1

나는 그런 방식으로 기본 클래스를 작성하려면이 패키지 구조 자바 : 하위 패키지에 임의의 클래스의 방법을 실행하면

  1. java.assignments 
        Main.java 
        java.assignments.lab1 
         Exe1.java 
        java.assignments.lab2 
         Exe1.java 
         Exe2.java 
         Exe3.java 
        java.assignments.lab3 
         Exe1.java 
         Exe2.java 
         Exe3.java 
         Exe4.java 
    and so on. 
    
    을 고려하는 것이 내가
    같은 명령 줄 경우 $ java java.assignments.Main exe java.assignments.lab2.Exe2이 프로그램은 내가주는 경우에 lab2.Exe2.java

  2. 에 저장된 주요 방법을 실행해야 $ java java.assignments.Main src java.assignments.lab2.Exe2이 프로그램은 인쇄한다 소스 코드 of Exe2.java

    표시되는 소스 코드에 I 이 포함되어 있으면 더 좋을 것입니다. 나는 그것은 모든 패키지를 나열한다 $ java java.assignments.Main list을주고 클래스 내가 $ java java.assignments.Main list java.assignements.lab3 그것은 java.assignments.lab3

에 포함 된 모든 클래스를 나열해야 주면

java.assignments에 포함 된 경우

  • 이런 일이 있습니까 가능하니? 그렇다면 어떻게해야합니까?

    내가 지금까지 발견 한 물건,

    나는 동적으로로드 할 수 있음을 발견하고 this tutorial에서 execute classes #1#, 하지만 어떻게 당신은에 포함 된 모든 클래스를 나열 할 수 없습니다 #2# displaying Source codelisting packages #3#

  • +0

    지금까지 해보신 것은 무엇입니까? 리플렉션에 어떤 문제가 있습니까? 예, 할 수있는 일이 가능합니다. 이 숙제가 있니? –

    +0

    @DaveNewton :'java.assignments.lab1.exe1.java'는 숙제입니다. 질문은 자바를 배우려고 노력하고 있습니다. 나는 반사가 어떻게 사용될 수 있는지 전혀 모른다. 그래서 나는 이것이 성취 될 수있는 방법에 대한 일반적인 아이디어를 찾고있다. – Gautam

    +0

    "반사 식 튜토리얼"에 대한 검색을 먼저 시도 할 것이고, 꽤 많은 자료가있다. :) –

    답변

    1

    리플렉션 학습을 시작하는 것을 권장하지 않습니다. 나는 초급자, 심지어 일부 중급 프로그래머들에게는 너무 어렵고 또한 너무 복잡하다고 생각한다. 내 생각에 개념을 이해한다고해도 리플렉션은 큰 주제이며 프로그래밍에서 구체적인 작업을 수행하는 데에서 멀리 떨어져 있습니다.

    그래서 나는이 대신 추천 :

    의 모든 "할당"클래스 그들은 당신이 다음 실행하는거야 방법을 정의 지시 인터페이스를 구현하게한다. 예를 들어, 해당 인터페이스 구현 MainClass.java라는 클래스에

    public interface MainClass 
    { 
        public void main(String[] args); 
    } 
    

    을 정의하고 과제의 각이 있습니다

    public class Lab2 implements MainClass 
    

    즉, 단지 넣어 클래스 선언 후 "MainClass을 구현합니다."

    아직 모르는 경우 명령 줄에서 java main 메서드에 전달 된 "arguments"문자열 배열을 처리해야합니다. 바로 여기서 "exe"와 사용자가 실행하기를 원하는 클래스의 이름이 나타납니다.

    따라서 "main main"방법은 첫 번째 인수를 테스트하여 "exe"와 같은지 확인합니다. 그렇다면 1. 클래스 이름 앞에 패키지 이름 (java.assignments)을 붙이고 Class.forName()을 사용하여 클래스를 인스턴스화 한 다음 Main으로 캐스팅하고 main 메소드를 실행합니다. 그 코드는 다음과 같습니다 :

    if (args[1].equalsIgnoreCase("exe")) // it might be args[0], I can't remember 
    { 
        String className = "java.assignments." + args[2]; 
        Object o = Class.forName(className); 
        Main mainMethodClass = (Main)o; 
        o.main(); 
    } 
    

    Class.forName()은 주어진 클래스 이름의 객체를 인스턴스화합니다. 필요한 것은 정규화 된 이름의 문자열뿐입니다.

    위의 Class.forName() 뒤의 줄은 새롭게 인스턴스화 된 객체를 Main 인터페이스에 "캐스트"합니다. 객체가 Main을 구현하지 않거나 확장하지 않으면 캐스트를 수행하는 행에서 코드가 실패합니다. Main을 구현하는 클래스에서 허용되는 일을 컴파일러에서 수행하도록 컴파일러에 지시합니다.

    그런 다음 객체는 "새로 만든"것과 같으며 정의 된 모든 메소드를 호출 할 수 있습니다.

    나는 다른 클래스에 대해 먼저 실행 해 보겠습니다. 소스를 표시하는 데 여전히 관심이 있고 어디에 소스를 넣을 지 알고 싶다면 다른 강의에서 그 정보를 얻을 수 있습니다. 이 런닝을 얻으면 한 번의 노력으로 성취 할 수있을 것입니다.

    rc

    +1

    글쎄, 자습서가 구체적으로 리플렉션을 목표로 한 것을 보았습니다. 아마 그렇게하고 싶을지도 모릅니다. 그러나 적어도 이것이 대안이라는 사실을 알고 있어야합니다. 나는 당신이 "상자에서"족답하고 당신의 지정을 확장하고 싶다는 것이 중대하다는 것을 생각한다; 일단 당신이 훈련을 끝내면 내 가게 엔트리 포지션으로 당신을 고용 할 것이고, 다른 것들은 평등합니다 (그리고 내가 가게를 가졌다면). – arcy

    +0

    그건 문제 1에 대한 매우 간단하면서도 흥미로운 해결책이었습니다. 고마워요. – Gautam

    1

    달성 할 Can you find all classes in a package using reflection?

    클래스의 소스 코드를 나열하려면 jar에 소스를 포함하고 어떻게 든 표시하는 것이 좋습니다.

    +0

    이것은 내가 정말로 붙어있는 부분이다. jar 파일에 소스가 포함되어 있습니다. 어떻게 나열하고 내용을 표시합니까? – Gautam

    +1

    @GautamK [JarInputStream] (http://download.oracle.com/javase/6/docs/api/java/util/jar/JarInputStream.html)을 사용하여 jar 파일의 리소스에 액세스 할 수 있습니다. 또는 클래스 패스에 있으면 임의의 리소스를로드 할 수 있습니다. 또한 jar 파일을 조사하여 패키지의 모든 클래스를 찾을 수 있습니다. –

    +1

    @ GautamK 또는 InputStream 객체를 반환하는 Class.getResourceAsSteam ("/ my/package/MyFile.java")을 사용합니다. 표준 출력에 입력 스트림을 작성하는 예제가 많이 있습니다. – Danny