如何获取任何java文件的类名

时间:2014-04-11 16:09:11

标签: java

java提供了一种简单的方法吗?

我知道如何使用Foo.class.getName())

来解决这个问题

但是,对于我可能通过某种方法传递的任何对象,我怎么能够做到这一点?说

public String getClass(File file){
          // Get file class
}

where file是一些扩展名为.java的java文件。我知道如果我直接将java类的名称硬编码到Foo.class.getName()中,它就有效,但我的方法包括在当前目录或包中找不到的java文件。有人引导我朝着正确的方向前进吗?提前致谢。

4 个答案:

答案 0 :(得分:4)

嗯.java文件需要与类或枚举相同的名称,所以我们可以使用文件名:

public String getClass(File file){
  return removeExtension(file.getName());
}

removeExtension有许多不同的实现方式,这里只有一个:

public static String removeExtension(String file){
  return file.replaceFirst("[.][^.]+$", "");
}

更多信息:How to get the filename without the extension in Java?

  

...我想要做的原因是我可以计算班级内的方法。

好吧,这不是这样做的方法,你应该考虑反思:What is reflection and why is it useful?

答案 1 :(得分:2)

您可以利用文件名。无需使用getClass()。您要做的是使用getName()获取File的文件名,然后您需要strip off the extension

在第二部分中有一个solution,在那个使用Apache FilenameUtils的SO问题中。对你而言,它会是这样的:

import org.apache.commons.io.FilenameUtils;

public String getClass(File file) {
    return FilenameUtils.removeExtension(file.getName());
}

当然,如果您已经创建了File,那么您应该已经有了它的名字。我刚刚将它放入你的存根函数中。

如果您总是要处理.java文件,那么您可以split()延长关闭:

    return file.getName().split(".java")[0];

答案 2 :(得分:2)

以下是在JavaParser的帮助下从源获取classname的示例代码。

这也适用于错误命名的源文件。

import com.github.javaparser.*;
import com.github.javaparser.ast.*;
import com.github.javaparser.ast.body.*;
import java.io.*;
import java.util.*;

public class ClassnameLister {

    private static String parseClassname(File filename) throws Exception {
        try (FileInputStream fin = new FileInputStream(filename)) {
            CompilationUnit cu = JavaParser.parse(fin);
            String packagePrefix = cu.getPackage().getName().toString();
            if (!packagePrefix.isEmpty()) packagePrefix += ".";
            for (TypeDeclaration type : cu.getTypes())
                if (type instanceOf ClassOrInterfaceDeclaration 
                        && ModifierSet.isPublic(type.getModifiers()))
                    return packagePrefix + type.getName();
        }
        return null;
    }

    public static void main(final String[] args) throws Exception {
        System.out.println(parseClassname(new File(args[0])));
    }
}

答案 3 :(得分:1)

您必须自己解析文件。

  1. 包 搜索以\\s*package开头的行。 如果找不到匹配的行,则不会声明包。

  2. 班级名称 外部类定义包含class,但可以启动并引导一个包含更多关键词的内容。最好的方法是先上课,然后检查最终的密钥。

  3. 使用点添加包名和类名,您就完成了。