java提供了一种简单的方法吗?
我知道如何使用Foo.class.getName())
但是,对于我可能通过某种方法传递的任何对象,我怎么能够做到这一点?说
public String getClass(File file){
// Get file class
}
where file是一些扩展名为.java的java文件。我知道如果我直接将java类的名称硬编码到Foo.class.getName()
中,它就有效,但我的方法包括在当前目录或包中找不到的java文件。有人引导我朝着正确的方向前进吗?提前致谢。
答案 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)
您必须自己解析文件。
包
搜索以\\s*package
开头的行。
如果找不到匹配的行,则不会声明包。
班级名称
外部类定义包含class
,但可以启动并引导一个包含更多关键词的内容。最好的方法是先上课,然后检查最终的密钥。
使用点添加包名和类名,您就完成了。