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.

  1. $ java java.assignments.Main exe java.assignments.lab2.Exe2プログラムがに保存されているメインメソッドを実行するように、次のようなコマンドを実行するようにメインクラスを記述したいと思います。lab2.Exe2.java

  2. 私が与える場合$ java java.assignments.Main src java.assignments.lab2.Exe2プログラムはExe2.javaのソースコードを出力する必要があります

    表示されたソースコードに、私がプログラムで書いたコメントが含まれているといいのですが。

  3. 私が与える場合$ java java.assignments.Main listそれは含まれているすべてのパッケージとクラスをリストする必要がありますjava.assignments

    私が与える場合$ java java.assignments.Main list java.assignements.lab3 それはに含まれるすべてのクラスをリストする必要がありますjava.assignments.lab3

これらのことは可能ですか?はいの場合、どうすればこれを達成できますか。

私が今までに見つけたもの、

このチュートリアルexecute classes #1# から動的にロードできることがわかりましたが、どのように達成し、#2# displaying Source codelisting packages #3#

4

2 に答える 2

1

リフレクションを使用してパッケージ内のすべてのクラスを見つけることができますか?に従って、パッケージに含まれるすべてのクラスを一覧表示することはできません。

クラスのソース コードを一覧表示する場合は、ソースを jar に含めて、何らかの方法で表示することをお勧めします。

于 2011-11-05T02:13:56.227 に答える
1

リフレクションの学習を開始することはお勧めしません。初心者には難しすぎ、中級者のプログラマーにとっても難しすぎると思います。つまり、概念などを理解していても、リフレクションは大きなトピックであり、プログラミングで具体的なことを行うことからかなり離れています。

したがって、代わりにこれをお勧めします。

すべての「割り当て」クラスに、実行するメソッドを定義するように指示するインターフェースを実装させます。たとえば、次のように定義します。

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

MainClass.java というクラスで、各割り当てにそのインターフェイスを実装させます。

public class Lab2 implements MainClass

つまり、クラス宣言の後に「implements MainClass」を置くだけです。

まだわからない場合は、コマンド ラインから Java のメイン メソッドに渡される「引数」文字列配列を処理する必要があります。そこに、「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 を実装するクラスで許可されていることを実行できるようにコンパイラに指示します。

その後、オブジェクトは "new " を実行したのと同じようになり、その上で定義された任意のメソッドを呼び出すことができます。

いくつかの異なるクラスで最初にその部分を実行すると思います。ソースを表示することにまだ興味があり、それをどこに置くべきかなどを知りたい場合は、別のレッスンでそれを説明できます。これを実行すれば、1回の努力で十分に達成できると思います。

ラジコン

于 2011-11-05T04:08:21.280 に答える