【问题标题】:Is there a way to programmatically tell a Java class's source?有没有办法以编程方式告诉 Java 类的来源?
【发布时间】:2014-11-09 05:48:22
【问题描述】:

Java 类加载器加载它可以找到的第一个具有匹配名称的类。有没有办法以编程方式判断加载了哪个?

也就是说,我可以更改下面的 main 以告知加载了哪个 ClassLoaderTest(除了调用 test())吗?

echo "public class ClassLoaderTest { public static String test() { return \"1\"; } }" > ClassLoaderTest.java
javac ClassLoaderTest.java
mkdir one
mv ClassLoaderTest.class one
echo "public class ClassLoaderTest { public static String test() { return \"2\"; } }" > ClassLoaderTest.java
javac ClassLoaderTest.java
mkdir two
mv ClassLoaderTest.class two
echo "public class Main { public static void main(String[] _) {  System.out.println(ClassLoaderTest.test()); } }" > Main.java
javac Main.java
java -classpath one:two:. Main
java -classpath two:one:. Main

这会根据类路径顺序输出1,然后是2

【问题讨论】:

  • 这个问题可能会有所帮助。 . . *.com/questions/227486/…
  • 不清楚:是要查找类的源代码,还是直接查找该类是从哪个目录加载的?

标签: java classloader


【解决方案1】:

getClass().getProtectionDomain().getCodeSource().getLocation() - JRE 类可能为空。

【讨论】:

  • 谢谢,分别返回文件:/one/ 和文件:/two/,这正是我要找的。​​span>
【解决方案2】:

您想要分析 Java 类的源代码。有为此目的量身定制的byte code parsers like ASM。当您查看 ASM 的代码时,它会通过

找到一个类的源代码
getClassLoader()
  .getResourceAsStream(ClassLoaderTest.class.getName().replace('.', '/') + ".class")

如果您只需要类文件的内容而不需要它的位置(甚至可能不存在),这就足够了。

另一种方法是通过ProtectionDomain 提到的方法,但它需要额外的安全权限或ClassLoader::getResource,这两者可能不适用于不将类文件存储在存储中的自定义ClassLoader

【讨论】:

    最近更新 更多