查找与Java导入相对应的OS文件。例如,查找仅从另一个文件导入内部类的源文件

时间:2011-02-25 11:32:57

标签: java import classloader

我需要在与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。有什么方法可以不猜测吗?

3 个答案:

答案 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{

您只获取文件名,而不是完整路径,但您可以进行一些字符串操作来构建它。您需要考虑的案例是:

  1. 文件名与完全限定名称的最后一部分匹配:这是一个普通的顶级类
  2. 文件名与完全限定名称的早期部分匹配:这是内部类
  3. 文件名与完全限定名称的任何部分都不匹配:这是在与另一个类相同的源文件中声明的非公共顶级类;这是非常不寻常的,如果你知道你没有这样的课程,可能不值得处理

答案 2 :(得分:0)

没有

类的源级名称中没有任何内容可以让您弄清楚它是否是内部类。它听起来就像你的描述一样,只限于那些信息。