.java文件类名的路径

时间:2012-12-13 13:07:57

标签: java javac abstract-syntax-tree javap

获取在.java文件上创建的类的最有效方法是什么?我有.java文件路径,我需要获取类的全名。

我只记得:

  1. 使用JavaCompiler
  2. 进行编译
  3. 使用文件文本使用Eclipse ASTParser(或其他)
  4. 解析它
  5. 通过部分文件路径推断类名,但我不知道 如果这适用于所有情况
  6. 不知何故,使用像javap这样的工具(真的没想过这个)
  7. 修改

    我有这个文件,位于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(我不知道是否这样     一个是正​​确的,但让我们假装它是)
    3. 当我只有.java文件路径(C:\myfolder\MyClass.java)时,如何获得这些类?

5 个答案:

答案 0 :(得分:1)

最有效的方法是Class.forName().getName()

答案 1 :(得分: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目录路径。

答案 2 :(得分:1)

可靠地获取类名称(介意它也可能定义接口)文件.java文件声明的唯一方法是真正解析该文件中包含的java语言。

甚至然后你需要知道将使用哪个编译器来编译.java文件,因为java编译器可以使用它对匿名类的任何命名约定(Oracle编译器使用$ 1,$ 2 ......,但没有严格的需要模仿这种行为)。

考虑到这些障碍,我认为从.java文件内容中很难做到,而单独使用.java文件路径是不可能的。

答案 3 :(得分:0)

一种方法是扫描Java源文件所在的目录树,对于以“.java”结尾的每个文件,将其完整文件夹路径作为String并将每个dir分隔符转换为“。”。字符。这将为您提供完全限定的类名(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
    }
}

希望这能正确地解释你的问题。

答案 4 :(得分:-1)

获取类文件的名称试试这个

      void printClassName(String classname) 


        {

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

        }