我需要在与Java文件中的导入相对应的类路径中找到OS文件。
我有代码解析java文件,获取它们的导入,然后在类路径中找到与给定导入相对应的源文件。如果没有找到java文件,则会在jar中找到.class文件或资源。为此,我使用下面的调用。
ClassLoader.getSystemClassLoader().getResource(import)
要成功完成此操作,我必须在导入中将“。”替换为“/”并附加相应的扩展名。例如,要查找java文件,我需要在上面的导入字符串中添加 “。java” 。
所以“ abc ”将分别成为“ a / b / c.java ”和“ a / b / c.class ”
现在这个工作正常并给我我想要的结果。当找到嵌套类和静态导入时会出现问题。例如。如果我们有一个class A (in package p)
contains an inner class B
,我们有一个导入“import p.A.B;
”,我们在类路径中有一个A的源代码A.java
我不能很容易找到the file corresponding to B is actually A.java
。有什么方法可以不猜测吗?
答案 0 :(得分:0)
我可能没有正确理解你的问题,但是编译器会为一个名为B的内部类(包含类A)创建一个名为A $ 1B.class的.class文件,因此文件名的第一部分是你的封闭类,这会告诉你代码所在的.java文件(即A.java)。
实施例: 我有一个名为Test的类,我创建了一个名为InnerClass的内部类。我编译并获得
Test.class
Test$InnerClass.class
因此,文件名的第一部分,在$之前是你的封闭类名,在本例中是Test。当你知道这一点时,你可以找到名为Test.java的.java文件。
H个
答案 1 :(得分:0)
你有编译的类文件吗?类文件包括编译它们的源文件的名称,这是您需要知道的。您可以通过在其中运行javap来看到这一点 - 第一行显示“Compiled from”,并提供文件名。例如:
$ javap java.lang.Character.UnicodeBlock
Compiled from "Character.java"
public final class java.lang.Character$UnicodeBlock extends java.lang.Character$Subset{
您只获取文件名,而不是完整路径,但您可以进行一些字符串操作来构建它。您需要考虑的案例是:
答案 2 :(得分:0)
没有
类的源级名称中没有任何内容可以让您弄清楚它是否是内部类。它听起来就像你的描述一样,只限于那些信息。