-1

.javaファイルに作成されたクラスを取得する最も効率的な方法は何ですか?.javaファイルパスがあり、クラスのフルネームを取得する必要があります。

私は覚えているだけです:

  1. JavaCompilerでコンパイルします
  2. ファイルテキストを使用してEclipseASTParser(または別の)で解析する
  3. ファイルパスの一部からクラス名を推測しますが、これがすべての場合に機能するかどうかはわかりません
  4. どういうわけか、javapのようなツールを使用してください(これについては実際には考えていませんでした)

編集

私はこのファイルを次の場所に持っていますC:\myfolder\MyClass.java(パッケージとフォルダの関連付け規則は無視しましょう):

package mypackage.mysubpackage;

public class MyClass 
{
    // my class implementation here

    public class MyInnerClass 
    {
        // my inner class implementation here
    } 
}

このファイルで宣言されているクラスのフルネームは次のとおりです。

  1. mypackage.mysubpackage.MyClass
  2. mypackage.mysubpackage.MyClass.MyInnerClass(これが正しいかどうかはわかりませんが、正しいふりをしましょう)

.javaファイルパス()しかない場合、どうすればこれらのクラスを取得できますC:\myfolder\MyClass.javaか?

4

5 に答える 5

1

.javaファイルが宣言するクラス(インターフェイスも定義する場合があることに注意してください)ファイルの名前を確実に取得する唯一の方法は、そのファイルに含まれるJava言語を実際に解析することです。

その場合でも、.javaファイルのコンパイルに使用される/使用されたコンパイラを知る必要があります。Javaコンパイラは匿名クラスに適した命名規則を使用できるためです(Oracleコンパイラは$ 1、$ 2 ...を使用しますが、その動作を模倣する厳密な必要はありません)。

これらの障害を考慮すると、.javaファイルの内容から実行するのは非常に困難であり、.javaファイルのパスだけでは不可能だと思います。

于 2012-12-13T15:53:37.817 に答える
1

最も効果的な方法はClass.forName().getName()

于 2012-12-13T13:09:59.283 に答える
1

.javaファイルパスがあり、クラスのフルネームを取得する必要があります。

つまり、.javaファイルのパスがわかっていて、各クラスファイルのクラス名が必要です。

class Filter {

public static void main(String[] a) {
    Filter f = new Filter();
    String dirName = "D:\\Yourfolder\\";  // assuming your java file are located in D:\Yourfolder\
    f.finder(dirName);  // call the method for listing all the class file
}

public File[] finder(String dirName) {

    File dir = new File(dirName);

    return dir.listFiles(new FilenameFilter() {

        public boolean accept(File dir, String filename) {
            if(filename.endsWith(".class"))
            {
            System.out.println(filename);
            }
            return filename.endsWith(".class");

        }
    });

}

}

dirName.javaディレクトリパスに置き換えます。

于 2012-12-13T13:30:57.787 に答える
0

1つの方法は、Javaソースファイルが配置されているディレクトリツリーをスキャンし、「。java」で終わるファイルごとに、その完全なフォルダパスを文字列として取得し、各ディレクトリ区切り文字を「。」に変換することです。キャラクター。これにより、完全修飾クラス名(FQCN)が提供されます。たとえば、パスがcom \ foo \ fee \ Foo.javaの場合、com.foo.fee.Fooになります。

もちろん、これは内部クラスやネストされたクラスやその他の高度なものを提供するものではありませんが、これらはコンパイル時に作成されます。

この種のディレクトリスキャンは、Springを含め、多くのフレームワークで見られました。

私はGroovyでこれに取り組んでいますが、これまでのところ次のようになっています。

File file = new File(rootSourcePath)

file.eachFileRecurse(FILES){
    def path =it.getAbsolutePath()
    println path

    if(path.endsWith(".java")){
           // to do the conversion here
    }
}

これがあなたの質問を正しく解釈したことを願っています。

于 2013-09-10T00:50:54.980 に答える
-1

クラスファイルの名前を取得するにはこれを試してください

      void printClassName(String classname) 


        {

          System.out.println("The class name " + classname +" is " + classname.getClass().getName());

        }
于 2012-12-13T13:29:23.993 に答える