【问题标题】:.java file path to class name.java 文件路径到类名
【发布时间】:2012-12-13 13:07:57
【问题描述】:

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

我只记得:

  1. JavaCompiler编译它
  2. 使用文件文本通过 Eclipse ASTParser(或其他)解析它
  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) 时如何获取这些类?

【问题讨论】:

  • 当你说你有路径时,我假设你没有文件名,对吧?
  • @rnunes 请查看我更新的帖子。
  • @Stephan:我有 .java 完整路径。我现在要编辑问题以使其更清楚。
  • 你试过我的帖子了吗??因为,这是我从你之前的帖子中得到的。我必须说,我的帖子将有助于您的方案
  • 你已经做了一个错误的假设:一个 .java 文件可以包含 多个 类(它最多可以包含一个 public类,但通常还有更多类,例如内部类或包访问类)。获取所有这些类名的唯一可靠方法是正确且完整地解析 .java 文件。

标签: java javac abstract-syntax-tree javap


【解决方案1】:

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

甚至那么你也需要知道哪个编译器将/已经用于编译.java文件,因为java编译器可以 em> 对匿名类使用它喜欢的任何命名约定(Oracle 编译器使用 $1、$2...,但没有严格需要模仿这种行为)。

考虑到这些障碍,我认为从 .java 文件内容很难做到这一点,而且仅靠 .java 文件路径根本不可能。

【讨论】:

  • 我相信,无论是类/接口,都将以类扩展结束。 AFAIC,他想列出所有班级名称。我真的不知道,他是否在问,是否可能或他自己对他的问题感到困惑。尽管如此,他还是得到了解决方案。我们得到了缓解。
【解决方案2】:

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

【讨论】:

【解决方案3】:

我有 .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 目录路径。

【讨论】:

  • 不,我只有一个 .java 文件路径,而您使用的是对 Class 对象的引用 (java.lang.String.class)
  • 即使在编辑之后,我们也只会给我 .class 文件的路径。我将编辑问题,使其更清楚。
  • 这应该有效,尽管只有当 .class 与 .java 文件位于同一目录中时(-d 选项,javac)
  • 所以基本上你说的是 .class 文件不存在。那为什么要大惊小怪呢? “我的班级”应该够了!如果不是这种情况,那么您确实需要更好地改写问题。
  • @munes 如果你有完整的路径(在编译中你没有为编译的文件指定不同的路径),那么你也有完整的类名。我还是不明白你在说什么
【解决方案4】:

一种方法是扫描 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
    }
}

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

【讨论】:

    【解决方案5】:

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

          void printClassName(String classname) 
    
    
            {
    
              System.out.println("The class name " + classname +" is " + classname.getClass().getName());
    
            }
    

    【讨论】:

    • 不,该代码只是打印您传递的字符串和 String.class 的名称
    猜你喜欢
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 2011-12-22
    • 2012-03-13
    • 2014-07-24
    • 2013-03-31
    • 1970-01-01
    • 2018-09-29
    相关资源
    最近更新 更多